@boarteam/boar-pack-users-backend 8.0.0 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit-logs/audit-logs.controller.js +2 -0
- package/dist/audit-logs/audit-logs.controller.js.map +1 -1
- package/dist/audit-logs/entities/audit-log.entity.js +4 -0
- package/dist/audit-logs/entities/audit-log.entity.js.map +1 -1
- package/dist/auth/auth-manage.controller.js +2 -0
- package/dist/auth/auth-manage.controller.js.map +1 -1
- package/dist/auth/auth.controller.js +4 -0
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/google/google-auth.controller.js +3 -0
- package/dist/auth/google/google-auth.controller.js.map +1 -1
- package/dist/auth/local-auth/local-auth.controller.js +2 -0
- package/dist/auth/local-auth/local-auth.controller.js.map +1 -1
- package/dist/auth/local-auth/local-auth.dto.js +7 -0
- package/dist/auth/local-auth/local-auth.dto.js.map +1 -1
- package/dist/auth/microsoft/ms-auth.controller.js +3 -0
- package/dist/auth/microsoft/ms-auth.controller.js.map +1 -1
- package/dist/auth/yandex/yandex-auth.controller.js +3 -0
- package/dist/auth/yandex/yandex-auth.controller.js.map +1 -1
- package/dist/event-logs/dto/event-log-create.dto.js +4 -0
- package/dist/event-logs/dto/event-log-create.dto.js.map +1 -1
- package/dist/event-logs/dto/event-log-timeline-query.dto.js +4 -0
- package/dist/event-logs/dto/event-log-timeline-query.dto.js.map +1 -1
- package/dist/event-logs/dto/event-log-timeline.dto.js +4 -0
- package/dist/event-logs/dto/event-log-timeline.dto.js.map +1 -1
- package/dist/event-logs/dto/event-log-update.dto.js +4 -0
- package/dist/event-logs/dto/event-log-update.dto.js.map +1 -1
- package/dist/event-logs/entities/event-log.entity.js +4 -0
- package/dist/event-logs/entities/event-log.entity.js.map +1 -1
- package/dist/event-logs/event-logs.controller.js +3 -0
- package/dist/event-logs/event-logs.controller.js.map +1 -1
- package/dist/event-logs/event-logs.logger.d.ts +2 -2
- package/dist/event-logs/event-logs.logger.js +2 -2
- package/dist/event-logs/event-logs.logger.js.map +1 -1
- package/dist/revoked-tokens/entities/revoked-token.entity.js +4 -0
- package/dist/revoked-tokens/entities/revoked-token.entity.js.map +1 -1
- package/dist/settings/dto/event-settings.dto.js +4 -0
- package/dist/settings/dto/event-settings.dto.js.map +1 -1
- package/dist/settings/entities/setting.entity.js +4 -0
- package/dist/settings/entities/setting.entity.js.map +1 -1
- package/dist/settings/settings.controller.js +3 -0
- package/dist/settings/settings.controller.js.map +1 -1
- package/dist/telegraf/dto/telegram-settings-update.dto.js +4 -0
- package/dist/telegraf/dto/telegram-settings-update.dto.js.map +1 -1
- package/dist/telegraf/dto/telegram-settings.dto.js +4 -0
- package/dist/telegraf/dto/telegram-settings.dto.js.map +1 -1
- package/dist/telegraf/telegraf.controller.js +4 -0
- package/dist/telegraf/telegraf.controller.js.map +1 -1
- package/dist/tokens/dto/token-create.dto.js +4 -0
- package/dist/tokens/dto/token-create.dto.js.map +1 -1
- package/dist/tokens/dto/token-update.dto.js +4 -0
- package/dist/tokens/dto/token-update.dto.js.map +1 -1
- package/dist/tokens/dto/token-with-value.dto.js +4 -0
- package/dist/tokens/dto/token-with-value.dto.js.map +1 -1
- package/dist/tokens/entities/token.entity.js +4 -0
- package/dist/tokens/entities/token.entity.js.map +1 -1
- package/dist/tokens/my-tokens.controller.js +2 -0
- package/dist/tokens/my-tokens.controller.js.map +1 -1
- package/dist/tokens/tokens.controller.js +1 -0
- package/dist/tokens/tokens.controller.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/users/dto/permission.dto.js +4 -0
- package/dist/users/dto/permission.dto.js.map +1 -1
- package/dist/users/dto/user-create.dto.js +4 -0
- package/dist/users/dto/user-create.dto.js.map +1 -1
- package/dist/users/dto/user-update.dto.js +4 -0
- package/dist/users/dto/user-update.dto.js.map +1 -1
- package/dist/users/entities/user.entity.js +4 -0
- package/dist/users/entities/user.entity.js.map +1 -1
- package/dist/users/me.controller.js +2 -0
- package/dist/users/me.controller.js.map +1 -1
- package/dist/users/users.controller.js +1 -0
- package/dist/users/users.controller.js.map +1 -1
- package/dist/ws-auth/ws-auth.guard.js +2 -2
- package/dist/ws-auth/ws-auth.guard.js.map +1 -1
- package/package.json +5 -5
- package/src/audit-logs/audit-log-base-service.ts +0 -169
- package/src/audit-logs/audit-logs.controller.ts +0 -74
- package/src/audit-logs/audit-logs.module.ts +0 -49
- package/src/audit-logs/audit-logs.permissions.ts +0 -4
- package/src/audit-logs/audit-logs.service.ts +0 -14
- package/src/audit-logs/audit-logs.types.ts +0 -9
- package/src/audit-logs/entities/audit-log.entity.ts +0 -46
- package/src/audit-logs/policies/view-audit-logs.policy.ts +0 -8
- package/src/auth/auth-manage.controller.ts +0 -35
- package/src/auth/auth-strategies.constants.ts +0 -7
- package/src/auth/auth.config.ts +0 -20
- package/src/auth/auth.constants.ts +0 -2
- package/src/auth/auth.controller.ts +0 -54
- package/src/auth/auth.exception-filter.ts +0 -15
- package/src/auth/auth.module.ts +0 -118
- package/src/auth/auth.service.ts +0 -122
- package/src/auth/google/google-auth.config.ts +0 -26
- package/src/auth/google/google-auth.controller.ts +0 -39
- package/src/auth/google/google-auth.guard.ts +0 -6
- package/src/auth/google/google-auth.strategy.ts +0 -59
- package/src/auth/index.ts +0 -15
- package/src/auth/local-auth/local-auth.controller.ts +0 -37
- package/src/auth/local-auth/local-auth.dto.ts +0 -17
- package/src/auth/local-auth/local-auth.guard.ts +0 -6
- package/src/auth/local-auth/local-auth.strategy.ts +0 -21
- package/src/auth/microsoft/ms-auth.config.ts +0 -29
- package/src/auth/microsoft/ms-auth.controller.ts +0 -40
- package/src/auth/microsoft/ms-auth.guard.ts +0 -8
- package/src/auth/microsoft/ms-auth.strategy.ts +0 -63
- package/src/auth/yandex/yandex-auth.config.ts +0 -26
- package/src/auth/yandex/yandex-auth.controller.ts +0 -39
- package/src/auth/yandex/yandex-auth.guard.ts +0 -6
- package/src/auth/yandex/yandex-auth.strategy.ts +0 -59
- package/src/bcrypt/bcrypt.config.ts +0 -27
- package/src/bcrypt/bcrypt.module.ts +0 -19
- package/src/bcrypt/bcrypt.service.ts +0 -24
- package/src/bcrypt/index.ts +0 -3
- package/src/casl/action.enum.ts +0 -7
- package/src/casl/casl-ability.factory.ts +0 -130
- package/src/casl/casl.module.ts +0 -31
- package/src/casl/fields-permission.interceptor.ts +0 -58
- package/src/casl/index.ts +0 -5
- package/src/casl/policies/manage-all.policy.ts +0 -9
- package/src/casl/policies.guard.ts +0 -80
- package/src/event-logs/dto/event-log-create.dto.ts +0 -47
- package/src/event-logs/dto/event-log-timeline-query.dto.ts +0 -13
- package/src/event-logs/dto/event-log-timeline.dto.ts +0 -9
- package/src/event-logs/dto/event-log-update.dto.ts +0 -47
- package/src/event-logs/entities/event-log.entity.ts +0 -140
- package/src/event-logs/event-logs.constants.ts +0 -2
- package/src/event-logs/event-logs.controller.ts +0 -80
- package/src/event-logs/event-logs.interceptor.ts +0 -75
- package/src/event-logs/event-logs.logger.ts +0 -48
- package/src/event-logs/event-logs.middleware.ts +0 -58
- package/src/event-logs/event-logs.module.ts +0 -131
- package/src/event-logs/event-logs.permissions.ts +0 -4
- package/src/event-logs/event-logs.service.ts +0 -236
- package/src/event-logs/event-logs.types.ts +0 -4
- package/src/event-logs/index.ts +0 -10
- package/src/event-logs/policies/manage-event-logs.policy.ts +0 -8
- package/src/event-logs/policies/view-event-logs.policy.ts +0 -8
- package/src/generateTypes.ts +0 -94
- package/src/index.ts +0 -10
- package/src/jwt-auth/index.ts +0 -5
- package/src/jwt-auth/jwt-auth.config.ts +0 -27
- package/src/jwt-auth/jwt-auth.guard.ts +0 -26
- package/src/jwt-auth/jwt-auth.module.ts +0 -64
- package/src/jwt-auth/jwt-auth.refresh.guard.ts +0 -7
- package/src/jwt-auth/jwt-auth.refresh.srtategy.ts +0 -85
- package/src/jwt-auth/jwt-auth.service.ts +0 -59
- package/src/jwt-auth/jwt-auth.srtategy.ts +0 -83
- package/src/revoked-tokens/entities/revoked-token.entity.ts +0 -50
- package/src/revoked-tokens/index.ts +0 -3
- package/src/revoked-tokens/revoked-tokens.module.ts +0 -29
- package/src/revoked-tokens/revoked-tokens.service.ts +0 -88
- package/src/settings/dto/event-settings.dto.ts +0 -3
- package/src/settings/entities/setting.entity.ts +0 -19
- package/src/settings/index.ts +0 -5
- package/src/settings/policies/manage-settings.policy.ts +0 -8
- package/src/settings/settings.constants.ts +0 -9
- package/src/settings/settings.controller.ts +0 -32
- package/src/settings/settings.module.ts +0 -46
- package/src/settings/settings.permissions.ts +0 -3
- package/src/settings/settings.service.ts +0 -51
- package/src/telegraf/dto/telegram-settings-update.dto.ts +0 -13
- package/src/telegraf/dto/telegram-settings.dto.ts +0 -5
- package/src/telegraf/index.ts +0 -3
- package/src/telegraf/telegraf.constants.ts +0 -5
- package/src/telegraf/telegraf.controller.ts +0 -40
- package/src/telegraf/telegraf.module.ts +0 -28
- package/src/telegraf/telegraf.service.ts +0 -110
- package/src/tokens/dto/token-create.dto.ts +0 -7
- package/src/tokens/dto/token-update.dto.ts +0 -7
- package/src/tokens/dto/token-with-value.dto.ts +0 -8
- package/src/tokens/entities/token.entity.ts +0 -26
- package/src/tokens/index.ts +0 -2
- package/src/tokens/my-tokens.controller.ts +0 -82
- package/src/tokens/policies/manage-my-tokens.policy.ts +0 -9
- package/src/tokens/policies/manage-tokens.policy.ts +0 -8
- package/src/tokens/policies/view-tokens.policy.ts +0 -8
- package/src/tokens/tokens-auth.guard.ts +0 -7
- package/src/tokens/tokens-auth.strategy.ts +0 -48
- package/src/tokens/tokens.constants.ts +0 -1
- package/src/tokens/tokens.controller.ts +0 -45
- package/src/tokens/tokens.module.ts +0 -86
- package/src/tokens/tokens.permissions.ts +0 -5
- package/src/tokens/tokens.service.ts +0 -14
- package/src/users/dto/permission.dto.ts +0 -5
- package/src/users/dto/user-create.dto.ts +0 -37
- package/src/users/dto/user-update.dto.ts +0 -37
- package/src/users/entities/permissions.ts +0 -23
- package/src/users/entities/user.entity.ts +0 -67
- package/src/users/hash-password.interceptor.ts +0 -22
- package/src/users/index.ts +0 -13
- package/src/users/me.controller.ts +0 -63
- package/src/users/policies/manage-users.policy.ts +0 -10
- package/src/users/policies/view-users.policy.ts +0 -10
- package/src/users/users-editing.guard.ts +0 -85
- package/src/users/users.config.ts +0 -27
- package/src/users/users.constants.ts +0 -1
- package/src/users/users.controller.ts +0 -85
- package/src/users/users.module.ts +0 -81
- package/src/users/users.service.ts +0 -23
- package/src/ws-auth/index.ts +0 -3
- package/src/ws-auth/ws-auth.constants.ts +0 -2
- package/src/ws-auth/ws-auth.d2 +0 -14
- package/src/ws-auth/ws-auth.gateway.ts +0 -25
- package/src/ws-auth/ws-auth.guard.ts +0 -28
- package/src/ws-auth/ws-auth.module.ts +0 -36
- package/src/ws-auth/ws-auth.service.ts +0 -108
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { PassportStrategy } from '@nestjs/passport';
|
|
2
|
-
import { Injectable, InternalServerErrorException, Logger, UnauthorizedException, } from '@nestjs/common';
|
|
3
|
-
import { AuthService } from '../auth.service';
|
|
4
|
-
import { MS_AUTH } from '../auth-strategies.constants';
|
|
5
|
-
import { MSAuthConfigService } from "./ms-auth.config";
|
|
6
|
-
import { JWTAuthService } from "../../jwt-auth/jwt-auth.service";
|
|
7
|
-
|
|
8
|
-
// @ts-ignore-next-line There are no types for this package
|
|
9
|
-
import { Strategy, VerifyCallback } from 'passport-azure-ad-oauth2';
|
|
10
|
-
|
|
11
|
-
@Injectable()
|
|
12
|
-
export class MSAuthStrategy extends PassportStrategy(
|
|
13
|
-
Strategy,
|
|
14
|
-
MS_AUTH,
|
|
15
|
-
) {
|
|
16
|
-
private readonly logger = new Logger(MSAuthStrategy.name);
|
|
17
|
-
|
|
18
|
-
constructor(
|
|
19
|
-
private authService: AuthService,
|
|
20
|
-
private msAuthConfigService: MSAuthConfigService,
|
|
21
|
-
private jwtAuthService: JWTAuthService,
|
|
22
|
-
) {
|
|
23
|
-
const config = msAuthConfigService.config;
|
|
24
|
-
super({
|
|
25
|
-
clientID: config.clientId,
|
|
26
|
-
clientSecret: config.clientSecret,
|
|
27
|
-
callbackURL: config.callbackURL,
|
|
28
|
-
tenant: config.tenantId,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async validate(
|
|
33
|
-
accessToken: string,
|
|
34
|
-
refreshToken: string,
|
|
35
|
-
profile: any,
|
|
36
|
-
callback: VerifyCallback,
|
|
37
|
-
): Promise<any> {
|
|
38
|
-
this.logger.debug(`accessToken: ${accessToken}`);
|
|
39
|
-
this.logger.debug(`refreshToken: ${refreshToken}`);
|
|
40
|
-
this.logger.debug(`profile: ${JSON.stringify(profile)}`);
|
|
41
|
-
const token = this.jwtAuthService.decode<{ email?: string, upn?: string }>(accessToken);
|
|
42
|
-
this.logger.debug(`token: ${JSON.stringify(token)}`);
|
|
43
|
-
try {
|
|
44
|
-
const user = await this.authService.validateUserByEmail(
|
|
45
|
-
token.email || token.upn,
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
if (!user) {
|
|
49
|
-
callback(new UnauthorizedException('User is not found'));
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
callback(null, user);
|
|
54
|
-
} catch (e) {
|
|
55
|
-
this.logger.error(e, e.stack);
|
|
56
|
-
callback(
|
|
57
|
-
new InternalServerErrorException(
|
|
58
|
-
'Impossible to log in user via ms',
|
|
59
|
-
),
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ConfigService } from '@nestjs/config';
|
|
3
|
-
|
|
4
|
-
export type TYandexAuthConfig = {
|
|
5
|
-
clientId: string;
|
|
6
|
-
clientSecret: string;
|
|
7
|
-
callbackURL: string;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
@Injectable()
|
|
11
|
-
export class YandexAuthConfigService {
|
|
12
|
-
constructor(private configService: ConfigService) {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
get config(): TYandexAuthConfig {
|
|
16
|
-
const clientId = this.configService.getOrThrow<string>('YANDEX_CLIENT_ID');
|
|
17
|
-
const clientSecret = this.configService.getOrThrow<string>('YANDEX_SECRET_ID');
|
|
18
|
-
const callbackURL = this.configService.getOrThrow<string>('YANDEX_CALLBACK_URL');
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
clientId,
|
|
22
|
-
clientSecret,
|
|
23
|
-
callbackURL,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Controller, Get, Req, Res, UnauthorizedException, UseFilters, UseGuards } from '@nestjs/common';
|
|
2
|
-
import { ApiTags } from '@nestjs/swagger';
|
|
3
|
-
import type { Request, Response } from 'express';
|
|
4
|
-
import { AuthService } from '../auth.service';
|
|
5
|
-
import { SkipJWTGuard } from '../../jwt-auth/jwt-auth.guard';
|
|
6
|
-
import { SkipPoliciesGuard } from '../../casl/policies.guard';
|
|
7
|
-
import { YandexAuthGuard } from './yandex-auth.guard';
|
|
8
|
-
import { AuthExceptionFilter } from '../auth.exception-filter';
|
|
9
|
-
|
|
10
|
-
@SkipPoliciesGuard()
|
|
11
|
-
@ApiTags('Authentication')
|
|
12
|
-
@Controller('auth/yandex')
|
|
13
|
-
export default class YandexAuthController {
|
|
14
|
-
constructor(private authService: AuthService) {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
@SkipJWTGuard()
|
|
18
|
-
@UseGuards(YandexAuthGuard)
|
|
19
|
-
@Get('')
|
|
20
|
-
async loginYandex() {
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@SkipJWTGuard()
|
|
24
|
-
@UseGuards(YandexAuthGuard)
|
|
25
|
-
@UseFilters(AuthExceptionFilter)
|
|
26
|
-
@Get('callback')
|
|
27
|
-
async loginYandexCallback(
|
|
28
|
-
@Req() req: Request,
|
|
29
|
-
@Res({ passthrough: true }) res: Response,
|
|
30
|
-
) {
|
|
31
|
-
if (!req.user) {
|
|
32
|
-
throw new UnauthorizedException(`User is not authorized`);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const tokens = await this.authService.login(req.user);
|
|
36
|
-
this.authService.setCookie(res, tokens);
|
|
37
|
-
res.redirect('/');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Strategy } from 'passport-yandex';
|
|
2
|
-
import { PassportStrategy } from '@nestjs/passport';
|
|
3
|
-
import {
|
|
4
|
-
Injectable,
|
|
5
|
-
InternalServerErrorException,
|
|
6
|
-
Logger,
|
|
7
|
-
UnauthorizedException,
|
|
8
|
-
} from '@nestjs/common';
|
|
9
|
-
import { AuthService } from '../auth.service';
|
|
10
|
-
import { YANDEX_AUTH } from '../auth-strategies.constants';
|
|
11
|
-
import { YandexAuthConfigService } from "./yandex-auth.config";
|
|
12
|
-
import { TUser } from "../../users";
|
|
13
|
-
|
|
14
|
-
@Injectable()
|
|
15
|
-
export class YandexAuthStrategy extends PassportStrategy(
|
|
16
|
-
Strategy,
|
|
17
|
-
YANDEX_AUTH,
|
|
18
|
-
) {
|
|
19
|
-
private readonly logger = new Logger(YandexAuthStrategy.name);
|
|
20
|
-
|
|
21
|
-
constructor(
|
|
22
|
-
private authService: AuthService,
|
|
23
|
-
private yandexAuthConfigService: YandexAuthConfigService,
|
|
24
|
-
) {
|
|
25
|
-
const config = yandexAuthConfigService.config;
|
|
26
|
-
super({
|
|
27
|
-
clientID: config.clientId,
|
|
28
|
-
clientSecret: config.clientSecret,
|
|
29
|
-
callbackURL: config.callbackURL,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async validate(
|
|
34
|
-
accessToken: string,
|
|
35
|
-
refreshToken: string,
|
|
36
|
-
profile: { emails: { value: string; verified: boolean }[] },
|
|
37
|
-
callback: (error: Error | null, user?: TUser | null) => void,
|
|
38
|
-
): Promise<any> {
|
|
39
|
-
try {
|
|
40
|
-
const user = await this.authService.validateUserByEmail(
|
|
41
|
-
profile.emails[0].value,
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
if (!user) {
|
|
45
|
-
callback(new UnauthorizedException('User is not found'));
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
callback(null, user);
|
|
50
|
-
} catch (e) {
|
|
51
|
-
this.logger.error(e, e.stack);
|
|
52
|
-
callback(
|
|
53
|
-
new InternalServerErrorException(
|
|
54
|
-
'Impossible to log in user via yandex',
|
|
55
|
-
),
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ConfigService } from '@nestjs/config';
|
|
3
|
-
|
|
4
|
-
export type TBcryptConfig = {
|
|
5
|
-
saltRounds: number;
|
|
6
|
-
experimentalFeatures: string[];
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
@Injectable()
|
|
10
|
-
export class BcryptConfigService {
|
|
11
|
-
constructor(private configService: ConfigService) {
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
get config(): TBcryptConfig {
|
|
15
|
-
const saltRounds = Number.parseInt(this.configService.get<string>('BCRYPT_SALT_ROUNDS', ''), 10);
|
|
16
|
-
const experimentalFeatures = this.configService.get<string>('EXPERIMENTAL_FEATURES');
|
|
17
|
-
|
|
18
|
-
if (!Number.isInteger(saltRounds)) {
|
|
19
|
-
throw new Error('BCRYPT_SALT_ROUNDS is not defined, set it as integer');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
saltRounds,
|
|
24
|
-
experimentalFeatures: experimentalFeatures ? experimentalFeatures.split(',') : [],
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Module } from "@nestjs/common";
|
|
2
|
-
import BcryptService from "./bcrypt.service";
|
|
3
|
-
import { ConfigModule } from "@nestjs/config";
|
|
4
|
-
import { BcryptConfigService } from "./bcrypt.config";
|
|
5
|
-
|
|
6
|
-
@Module({
|
|
7
|
-
imports: [
|
|
8
|
-
ConfigModule,
|
|
9
|
-
],
|
|
10
|
-
providers: [
|
|
11
|
-
BcryptService,
|
|
12
|
-
BcryptConfigService,
|
|
13
|
-
],
|
|
14
|
-
exports: [
|
|
15
|
-
BcryptService,
|
|
16
|
-
],
|
|
17
|
-
})
|
|
18
|
-
export class BcryptModule {
|
|
19
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@nestjs/common";
|
|
2
|
-
import { TBcryptConfig, BcryptConfigService } from "./bcrypt.config";
|
|
3
|
-
import bcrypt from "bcrypt";
|
|
4
|
-
|
|
5
|
-
@Injectable()
|
|
6
|
-
export class BcryptService {
|
|
7
|
-
private config: TBcryptConfig;
|
|
8
|
-
|
|
9
|
-
constructor(
|
|
10
|
-
private bcryptConfig: BcryptConfigService,
|
|
11
|
-
) {
|
|
12
|
-
this.config = this.bcryptConfig.config;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
hashPassword(password: string): Promise<string> {
|
|
16
|
-
return bcrypt.hash(password, this.config.saltRounds);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
compare(password: string, hash: string): Promise<boolean> {
|
|
20
|
-
return bcrypt.compare(password, hash);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export default BcryptService;
|
package/src/bcrypt/index.ts
DELETED
package/src/casl/action.enum.ts
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AbilityBuilder,
|
|
3
|
-
createMongoAbility,
|
|
4
|
-
ExtractSubjectType,
|
|
5
|
-
InferSubjects,
|
|
6
|
-
MongoAbility,
|
|
7
|
-
RawRule,
|
|
8
|
-
} from '@casl/ability';
|
|
9
|
-
import { Roles, User } from '../users/entities/user.entity';
|
|
10
|
-
import { Action } from './action.enum';
|
|
11
|
-
import { Injectable, Logger } from '@nestjs/common';
|
|
12
|
-
import { PackRule, packRules } from '@casl/ability/extra';
|
|
13
|
-
import { Permission } from '../users/entities/permissions';
|
|
14
|
-
import { EventLog } from '../event-logs';
|
|
15
|
-
import { Token } from "../tokens/entities/token.entity";
|
|
16
|
-
import { MyToken } from "../tokens/policies/manage-my-tokens.policy";
|
|
17
|
-
import { Setting } from "../settings/entities/setting.entity";
|
|
18
|
-
|
|
19
|
-
type AnyObject = Record<PropertyKey, unknown>;
|
|
20
|
-
|
|
21
|
-
export interface TSubjects {
|
|
22
|
-
User: typeof User;
|
|
23
|
-
EventLog: typeof EventLog;
|
|
24
|
-
Token: typeof Token;
|
|
25
|
-
MyToken: typeof MyToken;
|
|
26
|
-
Setting: typeof Setting;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export type TTextSubjects = 'all';
|
|
30
|
-
|
|
31
|
-
export type TSubjectsNames =
|
|
32
|
-
| keyof TSubjects
|
|
33
|
-
| TTextSubjects;
|
|
34
|
-
export type Subjects =
|
|
35
|
-
| InferSubjects<TSubjects[keyof TSubjects]>
|
|
36
|
-
| TTextSubjects;
|
|
37
|
-
|
|
38
|
-
export type AppAbility = MongoAbility<[Action, Subjects], AnyObject>;
|
|
39
|
-
|
|
40
|
-
type TAbilityDefiner = (
|
|
41
|
-
user: Pick<User, 'id' | 'role' | 'permissions'>,
|
|
42
|
-
can: AbilityBuilder<AppAbility>['can'],
|
|
43
|
-
cannot: AbilityBuilder<AppAbility>['cannot'],
|
|
44
|
-
) => Promise<void>;
|
|
45
|
-
|
|
46
|
-
@Injectable()
|
|
47
|
-
export class CaslAbilityFactory {
|
|
48
|
-
private static permissionsToActionsMap: {
|
|
49
|
-
[key in Permission]?: {
|
|
50
|
-
action: Action;
|
|
51
|
-
subject: Subjects | Subjects[];
|
|
52
|
-
}
|
|
53
|
-
} = {};
|
|
54
|
-
|
|
55
|
-
private static abilitiesDefiners: Set<TAbilityDefiner> = new Set();
|
|
56
|
-
private logger = new Logger(CaslAbilityFactory.name);
|
|
57
|
-
|
|
58
|
-
public static addPermissionToAction({
|
|
59
|
-
permission, action, subject,
|
|
60
|
-
}: {
|
|
61
|
-
permission: Permission,
|
|
62
|
-
action: Action,
|
|
63
|
-
subject: Subjects | Subjects[],
|
|
64
|
-
}) {
|
|
65
|
-
CaslAbilityFactory.permissionsToActionsMap[permission] = {
|
|
66
|
-
action,
|
|
67
|
-
subject
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
public static addAbilitiesDefiner(definer: TAbilityDefiner) {
|
|
72
|
-
CaslAbilityFactory.abilitiesDefiners.add(definer);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public async createForUser(user: Pick<User, 'id' | 'role' | 'permissions'>) {
|
|
76
|
-
const { can, cannot, build } = new AbilityBuilder<AppAbility>(createMongoAbility);
|
|
77
|
-
|
|
78
|
-
switch (user.role) {
|
|
79
|
-
case Roles.ADMIN:
|
|
80
|
-
can(Action.Manage, 'all');
|
|
81
|
-
break;
|
|
82
|
-
|
|
83
|
-
case Roles.USER:
|
|
84
|
-
user.permissions.forEach((permission) => {
|
|
85
|
-
const actionAndSubject = CaslAbilityFactory.permissionsToActionsMap[permission];
|
|
86
|
-
if (!actionAndSubject) {
|
|
87
|
-
this.logger.warn(`Unknown permission: ${permission}`);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const { action, subject } = actionAndSubject;
|
|
92
|
-
// @ts-ignore
|
|
93
|
-
can(action, subject);
|
|
94
|
-
});
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
await Promise.all(
|
|
99
|
-
Array.from(CaslAbilityFactory.abilitiesDefiners).map((definer) => definer(user, can, cannot)),
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
return build({
|
|
103
|
-
// Read https://casl.js.org/v5/en/guide/subject-type-detection#use-classes-as-subject-types for details
|
|
104
|
-
detectSubjectType: (item) =>
|
|
105
|
-
item.constructor as ExtractSubjectType<Subjects>,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
packAbility(ability: AppAbility): PackRule<RawRule>[] {
|
|
110
|
-
return packRules(
|
|
111
|
-
ability.rules.map((rule) => ({
|
|
112
|
-
action: rule.action,
|
|
113
|
-
subject: rule.subject,
|
|
114
|
-
inverted: rule.inverted,
|
|
115
|
-
conditions: rule.conditions,
|
|
116
|
-
})),
|
|
117
|
-
(item) => {
|
|
118
|
-
if (typeof item === 'string') {
|
|
119
|
-
return item;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (Array.isArray(item)) {
|
|
123
|
-
throw new Error('Cannot serialize ability');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return item.name;
|
|
127
|
-
},
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
}
|
package/src/casl/casl.module.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { CaslAbilityFactory } from './casl-ability.factory';
|
|
3
|
-
import { APP_GUARD } from '@nestjs/core';
|
|
4
|
-
import { PoliciesGuard } from './policies.guard';
|
|
5
|
-
|
|
6
|
-
@Module({})
|
|
7
|
-
export class CaslModule {
|
|
8
|
-
static forRoot() {
|
|
9
|
-
return {
|
|
10
|
-
module: CaslModule,
|
|
11
|
-
providers: [
|
|
12
|
-
CaslAbilityFactory,
|
|
13
|
-
{
|
|
14
|
-
provide: APP_GUARD,
|
|
15
|
-
useClass: PoliciesGuard,
|
|
16
|
-
},
|
|
17
|
-
],
|
|
18
|
-
exports: [CaslAbilityFactory],
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
static forFeature() {
|
|
23
|
-
return {
|
|
24
|
-
module: CaslModule,
|
|
25
|
-
providers: [
|
|
26
|
-
CaslAbilityFactory,
|
|
27
|
-
],
|
|
28
|
-
exports: [CaslAbilityFactory],
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
// fields-permission.interceptor.ts
|
|
2
|
-
import { CallHandler, ExecutionContext, ForbiddenException, Injectable, NestInterceptor, } from '@nestjs/common';
|
|
3
|
-
import { permittedFieldsOf } from '@casl/ability/extra';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
5
|
-
import { Request } from 'express';
|
|
6
|
-
import { Action } from "./action.enum";
|
|
7
|
-
import { Subjects } from "./casl-ability.factory";
|
|
8
|
-
import { PARSED_CRUD_REQUEST_KEY } from "@dataui/crud/lib/constants";
|
|
9
|
-
|
|
10
|
-
type Fields = string[] | undefined;
|
|
11
|
-
|
|
12
|
-
@Injectable()
|
|
13
|
-
export class FieldsPermissionInterceptor implements NestInterceptor {
|
|
14
|
-
constructor(
|
|
15
|
-
private readonly subject: Subjects,
|
|
16
|
-
private readonly action: Action,
|
|
17
|
-
) {
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
private anyField = '*';
|
|
21
|
-
|
|
22
|
-
intercept(ctx: ExecutionContext, next: CallHandler): Observable<any> {
|
|
23
|
-
const req = ctx.switchToHttp().getRequest<Request>();
|
|
24
|
-
const ability = req.user?.ability;
|
|
25
|
-
if (!ability) {
|
|
26
|
-
throw new ForbiddenException('No ability found on user');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const permitted = permittedFieldsOf(ability, this.action, this.subject, {
|
|
30
|
-
// how to read fields from each rule
|
|
31
|
-
fieldsFrom: (rule) => rule.fields || [this.anyField],
|
|
32
|
-
}) as string[];
|
|
33
|
-
|
|
34
|
-
if (permitted.includes(this.anyField)) {
|
|
35
|
-
// all fields are permitted
|
|
36
|
-
return next.handle();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// @ts-ignore
|
|
40
|
-
const crudReq = req[PARSED_CRUD_REQUEST_KEY];
|
|
41
|
-
const requested = (crudReq?.parsed?.fields as Fields) ?? [];
|
|
42
|
-
const finalFields =
|
|
43
|
-
(requested && requested.length > 0)
|
|
44
|
-
? requested.filter((f) => permitted.includes(f))
|
|
45
|
-
: permitted;
|
|
46
|
-
|
|
47
|
-
if (!finalFields || finalFields.length === 0) {
|
|
48
|
-
throw new ForbiddenException('No readable fields for this resource');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// enforce selection for Nestjsx/CRUD + TypeORM
|
|
52
|
-
// This makes CRUD build QB with SELECT only these columns.
|
|
53
|
-
if (!crudReq.parsed) crudReq.parsed = {} as any;
|
|
54
|
-
(crudReq.parsed as any).fields = finalFields;
|
|
55
|
-
|
|
56
|
-
return next.handle();
|
|
57
|
-
}
|
|
58
|
-
}
|
package/src/casl/index.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { IPolicyHandler } from '../policies.guard';
|
|
2
|
-
import { AppAbility } from '../casl-ability.factory';
|
|
3
|
-
import { Action } from '../action.enum';
|
|
4
|
-
|
|
5
|
-
export class ManageAllPolicy implements IPolicyHandler {
|
|
6
|
-
handle(ability: AppAbility) {
|
|
7
|
-
return ability.can(Action.Manage, 'all');
|
|
8
|
-
}
|
|
9
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CanActivate,
|
|
3
|
-
ExecutionContext,
|
|
4
|
-
Injectable,
|
|
5
|
-
Logger,
|
|
6
|
-
SetMetadata,
|
|
7
|
-
} from '@nestjs/common';
|
|
8
|
-
import { Reflector } from '@nestjs/core';
|
|
9
|
-
import { AppAbility, CaslAbilityFactory } from './casl-ability.factory';
|
|
10
|
-
|
|
11
|
-
export interface IPolicyHandler {
|
|
12
|
-
handle(ability: AppAbility): boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export type PolicyHandlerCallback = (ability: AppAbility) => boolean;
|
|
16
|
-
|
|
17
|
-
export type PolicyHandler = IPolicyHandler | PolicyHandlerCallback;
|
|
18
|
-
|
|
19
|
-
export const CHECK_POLICIES_KEY = 'check_policy';
|
|
20
|
-
export const CheckPolicies = (...handlers: PolicyHandler[]) =>
|
|
21
|
-
SetMetadata(CHECK_POLICIES_KEY, handlers);
|
|
22
|
-
|
|
23
|
-
export const SKIP_POLICIES_GUARD = 'skip_policies_guard';
|
|
24
|
-
export const SkipPoliciesGuard = () => SetMetadata(SKIP_POLICIES_GUARD, true);
|
|
25
|
-
|
|
26
|
-
@Injectable()
|
|
27
|
-
export class PoliciesGuard implements CanActivate {
|
|
28
|
-
private readonly logger = new Logger(PoliciesGuard.name);
|
|
29
|
-
|
|
30
|
-
constructor(
|
|
31
|
-
private reflector: Reflector,
|
|
32
|
-
private caslAbilityFactory: CaslAbilityFactory,
|
|
33
|
-
) {}
|
|
34
|
-
|
|
35
|
-
async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
36
|
-
const skipGuard = this.reflector.getAllAndOverride<boolean>(
|
|
37
|
-
SKIP_POLICIES_GUARD,
|
|
38
|
-
[context.getHandler(), context.getClass()],
|
|
39
|
-
);
|
|
40
|
-
if (skipGuard) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const policyHandlers = this.reflector.getAllAndOverride<
|
|
45
|
-
PolicyHandler[] | undefined
|
|
46
|
-
>(CHECK_POLICIES_KEY, [context.getHandler(), context.getClass()]);
|
|
47
|
-
|
|
48
|
-
if (!policyHandlers) {
|
|
49
|
-
this.logger.warn(
|
|
50
|
-
'Policies for action are not found. Endpoints are closed by default',
|
|
51
|
-
);
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
let user;
|
|
56
|
-
if (context.getType() === 'http') {
|
|
57
|
-
const request = context.switchToHttp().getRequest();
|
|
58
|
-
user = request.user;
|
|
59
|
-
} else if (context.getType() === 'ws') {
|
|
60
|
-
const client = context.switchToWs().getClient();
|
|
61
|
-
user = client.user;
|
|
62
|
-
} else {
|
|
63
|
-
throw new Error('Unknown context type');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const ability = await this.caslAbilityFactory.createForUser(user);
|
|
67
|
-
user.ability = ability;
|
|
68
|
-
|
|
69
|
-
return policyHandlers.every((handler) =>
|
|
70
|
-
this.execPolicyHandler(handler, ability),
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private execPolicyHandler(handler: PolicyHandler, ability: AppAbility) {
|
|
75
|
-
if (typeof handler === 'function') {
|
|
76
|
-
return handler(ability);
|
|
77
|
-
}
|
|
78
|
-
return handler.handle(ability);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { JoiSchema } from 'nestjs-joi';
|
|
2
|
-
import Joi from 'joi';
|
|
3
|
-
import { LogType, UserRole, LogLevel } from '../entities/event-log.entity';
|
|
4
|
-
|
|
5
|
-
export class EventLogCreateDto {
|
|
6
|
-
@JoiSchema(Joi.string().valid(...Object.values(LogType)).required())
|
|
7
|
-
logType: LogType;
|
|
8
|
-
|
|
9
|
-
@JoiSchema(Joi.string().valid(...Object.values(LogLevel)).required())
|
|
10
|
-
logLevel: LogLevel;
|
|
11
|
-
|
|
12
|
-
@JoiSchema(Joi.string().required())
|
|
13
|
-
action: string;
|
|
14
|
-
|
|
15
|
-
@JoiSchema(Joi.string().optional())
|
|
16
|
-
method?: string;
|
|
17
|
-
|
|
18
|
-
@JoiSchema(Joi.string().uuid().allow(null).optional())
|
|
19
|
-
userId?: string;
|
|
20
|
-
|
|
21
|
-
@JoiSchema(Joi.string().valid(...Object.values(UserRole)).required())
|
|
22
|
-
userRole: string;
|
|
23
|
-
|
|
24
|
-
@JoiSchema(Joi.string().required())
|
|
25
|
-
entity: string;
|
|
26
|
-
|
|
27
|
-
@JoiSchema(Joi.string().uuid().allow(null).optional())
|
|
28
|
-
entityId?: string;
|
|
29
|
-
|
|
30
|
-
@JoiSchema(Joi.object().allow(null).optional())
|
|
31
|
-
payload?: Record<string, any>;
|
|
32
|
-
|
|
33
|
-
@JoiSchema(Joi.string().allow(null).optional())
|
|
34
|
-
url?: string;
|
|
35
|
-
|
|
36
|
-
@JoiSchema(Joi.string().allow(null).optional())
|
|
37
|
-
ipAddress?: string;
|
|
38
|
-
|
|
39
|
-
@JoiSchema(Joi.string().allow(null).optional())
|
|
40
|
-
userAgent?: string;
|
|
41
|
-
|
|
42
|
-
@JoiSchema(Joi.number().integer().allow(null).optional())
|
|
43
|
-
duration?: number;
|
|
44
|
-
|
|
45
|
-
@JoiSchema(Joi.number().integer().allow(null).optional())
|
|
46
|
-
statusCode?: number;
|
|
47
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import Joi from "joi";
|
|
2
|
-
import { JoiSchema } from "nestjs-joi";
|
|
3
|
-
|
|
4
|
-
export class EventLogTimelineQueryDto {
|
|
5
|
-
@JoiSchema(Joi.string().isoDate().optional())
|
|
6
|
-
startTime?: string;
|
|
7
|
-
|
|
8
|
-
@JoiSchema(Joi.string().isoDate().optional())
|
|
9
|
-
endTime?: string;
|
|
10
|
-
|
|
11
|
-
@JoiSchema(Joi.string().optional())
|
|
12
|
-
timezone?: string;
|
|
13
|
-
}
|