@spinajs/rbac-http 2.0.26 → 2.0.38

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.
Files changed (41) hide show
  1. package/lib/2fa/SpeakEasy2FaToken.d.ts +13 -0
  2. package/lib/2fa/SpeakEasy2FaToken.js +92 -0
  3. package/lib/2fa/SpeakEasy2FaToken.js.map +1 -0
  4. package/lib/config/rbac-http.js +11 -0
  5. package/lib/config/rbac-http.js.map +1 -1
  6. package/lib/controllers/LoginController.d.ts +8 -2
  7. package/lib/controllers/LoginController.js +63 -5
  8. package/lib/controllers/LoginController.js.map +1 -1
  9. package/lib/controllers/TwoFactorAuthController.d.ts +11 -0
  10. package/lib/controllers/TwoFactorAuthController.js +72 -0
  11. package/lib/controllers/TwoFactorAuthController.js.map +1 -0
  12. package/lib/controllers/UserController.d.ts +2 -0
  13. package/lib/controllers/UserController.js +12 -1
  14. package/lib/controllers/UserController.js.map +1 -1
  15. package/lib/decorators.js +3 -3
  16. package/lib/decorators.js.map +1 -1
  17. package/lib/dto/login-dto.d.ts +1 -6
  18. package/lib/dto/login-dto.js +7 -8
  19. package/lib/dto/login-dto.js.map +1 -1
  20. package/lib/dto/token-dto.d.ts +15 -0
  21. package/lib/dto/token-dto.js +32 -0
  22. package/lib/dto/token-dto.js.map +1 -0
  23. package/lib/dto/userLogin-dto.d.ts +21 -0
  24. package/lib/dto/userLogin-dto.js +34 -0
  25. package/lib/dto/userLogin-dto.js.map +1 -0
  26. package/lib/index.d.ts +1 -1
  27. package/lib/index.js +1 -1
  28. package/lib/index.js.map +1 -1
  29. package/lib/interfaces.d.ts +37 -0
  30. package/lib/interfaces.js +7 -0
  31. package/lib/interfaces.js.map +1 -1
  32. package/lib/policies/2FaPolicy.d.ts +7 -0
  33. package/lib/policies/2FaPolicy.js +32 -0
  34. package/lib/policies/2FaPolicy.js.map +1 -0
  35. package/lib/policies/AuthPolicy.d.ts +9 -0
  36. package/lib/policies/AuthPolicy.js +23 -0
  37. package/lib/policies/AuthPolicy.js.map +1 -0
  38. package/lib/policies/RbacPolicy.d.ts +15 -0
  39. package/lib/policies/RbacPolicy.js +60 -0
  40. package/lib/policies/RbacPolicy.js.map +1 -0
  41. package/package.json +16 -12
@@ -0,0 +1,13 @@
1
+ import { TwoFactorAuthProvider } from '../interfaces';
2
+ import { User } from '@spinajs/rbac';
3
+ import { Log } from '@spinajs/log';
4
+ export declare class SpeakEasy2FaToken extends TwoFactorAuthProvider {
5
+ protected Config: any;
6
+ protected Log: Log;
7
+ constructor();
8
+ execute(_: User): Promise<void>;
9
+ verifyToken(token: string, user: User): Promise<boolean>;
10
+ initialize(user: User): Promise<any>;
11
+ isEnabled(user: User): Promise<boolean>;
12
+ isInitialized(user: User): Promise<boolean>;
13
+ }
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __metadata = (this && this.__metadata) || function (k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.SpeakEasy2FaToken = void 0;
36
+ const di_1 = require("@spinajs/di");
37
+ const interfaces_1 = require("../interfaces");
38
+ const speakeasy = __importStar(require("speakeasy"));
39
+ const rbac_1 = require("@spinajs/rbac");
40
+ const configuration_1 = require("@spinajs/configuration");
41
+ const log_1 = require("@spinajs/log");
42
+ let SpeakEasy2FaToken = class SpeakEasy2FaToken extends interfaces_1.TwoFactorAuthProvider {
43
+ constructor() {
44
+ super();
45
+ }
46
+ execute(_) {
47
+ // empty, speakasy works offline eg. google authenticator
48
+ // we dont send any email or sms
49
+ return Promise.resolve();
50
+ }
51
+ async verifyToken(token, user) {
52
+ const meta = user.Metadata.find((x) => x.Key === '2fa_speakeasy_token');
53
+ if (!meta || meta.Value === '') {
54
+ this.Log.trace(`Cannot verify 2fa token, no 2fa token for user ${user.Id}`);
55
+ return false;
56
+ }
57
+ const verified = speakeasy.totp.verify({
58
+ secret: meta.Value,
59
+ encoding: 'base32',
60
+ token,
61
+ window: 5,
62
+ });
63
+ return verified;
64
+ }
65
+ async initialize(user) {
66
+ const secret = speakeasy.generateSecret(this.Config);
67
+ await user.Metadata.add(new rbac_1.UserMetadata({ Value: secret.base32, Key: '2fa_speakeasy_token' }));
68
+ return secret.base32;
69
+ }
70
+ async isEnabled(user) {
71
+ const meta = user.Metadata.find((x) => x.Key === '2fa_enabled');
72
+ return meta ? meta.asBoolean() : false;
73
+ }
74
+ async isInitialized(user) {
75
+ const meta = user.Metadata.find((x) => x.Key === '2fa_speakeasy_token');
76
+ return meta ? meta.Value !== '' : false;
77
+ }
78
+ };
79
+ __decorate([
80
+ (0, configuration_1.Config)('rbac.speakeasy'),
81
+ __metadata("design:type", Object)
82
+ ], SpeakEasy2FaToken.prototype, "Config", void 0);
83
+ __decorate([
84
+ (0, log_1.Logger)('SPEAKEASY_2FA_TOKEN'),
85
+ __metadata("design:type", log_1.Log)
86
+ ], SpeakEasy2FaToken.prototype, "Log", void 0);
87
+ SpeakEasy2FaToken = __decorate([
88
+ (0, di_1.Injectable)(interfaces_1.TwoFactorAuthProvider),
89
+ __metadata("design:paramtypes", [])
90
+ ], SpeakEasy2FaToken);
91
+ exports.SpeakEasy2FaToken = SpeakEasy2FaToken;
92
+ //# sourceMappingURL=SpeakEasy2FaToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakEasy2FaToken.js","sourceRoot":"","sources":["../../src/2fa/SpeakEasy2FaToken.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAAyC;AACzC,8CAAsD;AACtD,qDAAuC;AACvC,wCAAmD;AACnD,0DAAgD;AAChD,sCAA2C;AAG3C,IAAa,iBAAiB,GAA9B,MAAa,iBAAkB,SAAQ,kCAAqB;IAO1D;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAEM,OAAO,CAAC,CAAO;QACpB,yDAAyD;QACzD,gCAAgC;QAChC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACM,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,IAAU;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;QAExE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE;YAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAE5E,OAAO,KAAK,CAAC;SACd;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,QAAQ,EAAE,QAAQ;YAClB,KAAK;YACL,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IACM,KAAK,CAAC,UAAU,CAAC,IAAU;QAChC,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,mBAAY,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACM,KAAK,CAAC,SAAS,CAAC,IAAU;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,IAAU;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;CACF,CAAA;AA9CC;IADC,IAAA,sBAAM,EAAC,gBAAgB,CAAC;;iDACH;AAGtB;IADC,IAAA,YAAM,EAAC,qBAAqB,CAAC;8BACf,SAAG;8CAAC;AALR,iBAAiB;IAD7B,IAAA,eAAU,EAAC,kCAAqB,CAAC;;GACrB,iBAAiB,CAgD7B;AAhDY,8CAAiB"}
@@ -12,6 +12,17 @@ module.exports = {
12
12
  views: [dir('./../views')],
13
13
  },
14
14
  },
15
+ rbac: {
16
+ twoFactorAuth: {
17
+ enabled: true,
18
+ service: 'google-auth-2fa',
19
+ },
20
+ fingerprint: {
21
+ enabled: true,
22
+ maxDevices: 3,
23
+ service: 'fingerprintjs',
24
+ },
25
+ },
15
26
  http: {
16
27
  middlewares: [
17
28
  // add global user from session middleware
@@ -1 +1 @@
1
- {"version":3,"file":"rbac-http.js","sourceRoot":"","sources":["../../src/config/rbac-http.ts"],"names":[],"mappings":";;AAAA,+BAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,OAAO,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,WAAW,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;QACX,0CAA0C;SAC3C;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"rbac-http.js","sourceRoot":"","sources":["../../src/config/rbac-http.ts"],"names":[],"mappings":";;AAAA,+BAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,OAAO,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,WAAW,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,aAAa,EAAE;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,iBAAiB;SAC3B;QACD,WAAW,EAAE;YACX,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,eAAe;SACzB;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;QACX,0CAA0C;SAC3C;KACF;CACF,CAAC"}
@@ -1,12 +1,18 @@
1
- import { LoginDto } from './../dto/login-dto';
1
+ import { UserLoginDto } from '../dto/userLogin-dto';
2
2
  import { BaseController, Ok, CookieResponse, Unauthorized, NotAllowed } from '@spinajs/http';
3
3
  import { AuthProvider, SessionProvider, User as UserModel } from '@spinajs/rbac';
4
4
  import { Configuration } from '@spinajs/configuration';
5
+ import { FingerpringConfig, FingerprintProvider, TwoFactorAuthConfig, TwoFactorAuthProvider } from '../interfaces';
5
6
  export declare class LoginController extends BaseController {
6
7
  protected Configuration: Configuration;
7
8
  protected AuthProvider: AuthProvider;
8
9
  protected SessionProvider: SessionProvider;
9
10
  protected SessionExpirationTime: number;
10
- login(credentials: LoginDto, logged: UserModel): Promise<Unauthorized | CookieResponse | NotAllowed>;
11
+ protected TwoFactorConfig: TwoFactorAuthConfig;
12
+ protected FingerPrintConfig: FingerpringConfig;
13
+ protected TwoFactorAuthProvider: TwoFactorAuthProvider;
14
+ protected FingerprintPrivider: FingerprintProvider;
15
+ resolveAsync(): Promise<void>;
16
+ login(credentials: UserLoginDto, logged: UserModel): Promise<Unauthorized | CookieResponse | NotAllowed>;
11
17
  logout(ssid: string): Promise<Ok | CookieResponse>;
12
18
  }
@@ -16,7 +16,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  };
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.LoginController = void 0;
19
- const login_dto_1 = require("./../dto/login-dto");
19
+ const userLogin_dto_1 = require("../dto/userLogin-dto");
20
20
  const http_1 = require("@spinajs/http");
21
21
  const rbac_1 = require("@spinajs/rbac");
22
22
  const di_1 = require("@spinajs/di");
@@ -24,6 +24,20 @@ const configuration_1 = require("@spinajs/configuration");
24
24
  const decorators_1 = require("./../decorators");
25
25
  const lodash_1 = __importDefault(require("lodash"));
26
26
  let LoginController = class LoginController extends http_1.BaseController {
27
+ async resolveAsync() {
28
+ if (this.TwoFactorConfig.enabled) {
29
+ if (!di_1.DI.check(this.TwoFactorConfig.service)) {
30
+ throw new di_1.ServiceNotFound(`2FA provider ${this.TwoFactorConfig.service} not registered in DI container`);
31
+ }
32
+ this.TwoFactorAuthProvider = di_1.DI.resolve(this.TwoFactorConfig.service);
33
+ }
34
+ if (this.FingerPrintConfig.enabled) {
35
+ if (!di_1.DI.check(this.FingerPrintConfig.service)) {
36
+ throw new di_1.ServiceNotFound(`Fingerprint provider ${this.FingerPrintConfig.service} not registered in DI container`);
37
+ }
38
+ this.FingerprintPrivider = di_1.DI.resolve(this.FingerPrintConfig.service);
39
+ }
40
+ }
27
41
  async login(credentials, logged) {
28
42
  if (logged) {
29
43
  return new http_1.NotAllowed('User already logged in. Please logout before trying to authorize.');
@@ -38,11 +52,47 @@ let LoginController = class LoginController extends http_1.BaseController {
38
52
  }
39
53
  await user.Metadata.populate();
40
54
  const session = new rbac_1.Session();
41
- const sData = user.dehydrate();
42
- session.Data.set('User', sData);
55
+ const dUser = user.dehydrate();
56
+ session.Data.set('User', dUser);
57
+ // we found user but we still dont know if is authorized
58
+ // eg. 2fa auth is not performed
59
+ // create session, but user is not yet authorized
60
+ session.Data.set('Authorized', false);
61
+ await this.SessionProvider.save(session);
62
+ if (this.TwoFactorConfig.enabled) {
63
+ const enabledForUser = await this.TwoFactorAuthProvider.isEnabled(user);
64
+ /**
65
+ * if 2fa is enabled for user, proceed
66
+ */
67
+ if (enabledForUser) {
68
+ /**
69
+ * check if 2fa system is initialized for user eg. private key is generated.
70
+ */
71
+ const isInitialized = await this.TwoFactorAuthProvider.isInitialized(user);
72
+ if (!isInitialized) {
73
+ const twoFaResult = await this.TwoFactorAuthProvider.initialize(user);
74
+ return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, true, {
75
+ toFactorAuth: true,
76
+ initialize: true,
77
+ method: this.TwoFactorConfig.service,
78
+ data: twoFaResult,
79
+ }, { httpOnly: true });
80
+ }
81
+ // give chance to execute 2fa eg. send sms or email
82
+ await this.TwoFactorAuthProvider.execute(user);
83
+ // return session to identify user
84
+ // and only info that twoFactor auth is requested
85
+ return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, true, {
86
+ toFactorAuth: true,
87
+ }, { httpOnly: true });
88
+ }
89
+ }
90
+ // 2fa is not enabled, so we found user, it means it is logged
91
+ session.Data.set('Authorized', true);
43
92
  await this.SessionProvider.save(session);
44
93
  // BEWARE: httpOnly coockie, only accesible via http method in browser
45
- return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, true, lodash_1.default.omit(sData, ['Id']), { httpOnly: true });
94
+ // return coockie session id with additional user data
95
+ return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, true, lodash_1.default.omit(dUser, ['Id']), { httpOnly: true });
46
96
  }
47
97
  async logout(ssid) {
48
98
  if (!ssid) {
@@ -69,12 +119,20 @@ __decorate([
69
119
  (0, configuration_1.Config)('rbac.session.expiration', 120),
70
120
  __metadata("design:type", Number)
71
121
  ], LoginController.prototype, "SessionExpirationTime", void 0);
122
+ __decorate([
123
+ (0, configuration_1.Config)('rbac.twoFactorAuth'),
124
+ __metadata("design:type", Object)
125
+ ], LoginController.prototype, "TwoFactorConfig", void 0);
126
+ __decorate([
127
+ (0, configuration_1.Config)('rbac.fingerprint'),
128
+ __metadata("design:type", Object)
129
+ ], LoginController.prototype, "FingerPrintConfig", void 0);
72
130
  __decorate([
73
131
  (0, http_1.Post)(),
74
132
  __param(0, (0, http_1.Body)()),
75
133
  __param(1, (0, decorators_1.User)()),
76
134
  __metadata("design:type", Function),
77
- __metadata("design:paramtypes", [login_dto_1.LoginDto, rbac_1.User]),
135
+ __metadata("design:paramtypes", [userLogin_dto_1.UserLoginDto, rbac_1.User]),
78
136
  __metadata("design:returntype", Promise)
79
137
  ], LoginController.prototype, "login", null);
80
138
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../src/controllers/LoginController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,wCAAgI;AAChI,wCAA0F;AAC1F,oCAAyC;AACzC,0DAA+D;AAC/D,gDAAuC;AACvC,oDAAuB;AAGvB,IAAa,eAAe,GAA5B,MAAa,eAAgB,SAAQ,qBAAc;IAc1C,KAAK,CAAC,KAAK,CAAS,WAAqB,EAAU,MAAiB;QACzE,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,iBAAU,CAAC,mEAAmE,CAAC,CAAC;SAC5F;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE3F,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,mBAAY,CAAC;gBACtB,KAAK,EAAE;oBACL,OAAO,EAAE,6BAA6B;iBACvC;aACF,CAAC,CAAC;SACJ;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAE/B,MAAM,OAAO,GAAG,IAAI,cAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAE/B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEhC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzC,sEAAsE;QACtE,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,gBAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpI,CAAC;IAGM,KAAK,CAAC,MAAM,CAAW,IAAY;QACxC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,SAAE,EAAE,CAAC;SACjB;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExC,gDAAgD;QAChD,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACF,CAAA;AAnDC;IADC,IAAA,eAAU,GAAE;8BACY,6BAAa;sDAAC;AAGvC;IADC,IAAA,eAAU,GAAE;8BACW,mBAAY;qDAAC;AAGrC;IADC,IAAA,eAAU,GAAE;8BACc,sBAAe;wDAAC;AAG3C;IADC,IAAA,sBAAM,EAAC,yBAAyB,EAAE,GAAG,CAAC;;8DACC;AAGxC;IADC,IAAA,WAAI,GAAE;IACa,WAAA,IAAA,WAAI,GAAE,CAAA;IAAyB,WAAA,IAAA,iBAAI,GAAE,CAAA;;qCAAjB,oBAAQ,EAAkB,WAAS;;4CA0B1E;AAGD;IADC,IAAA,UAAG,GAAE;IACe,WAAA,IAAA,aAAM,GAAE,CAAA;;;;6CAS5B;AApDU,eAAe;IAD3B,IAAA,eAAQ,EAAC,WAAW,CAAC;GACT,eAAe,CAqD3B;AArDY,0CAAe"}
1
+ {"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../src/controllers/LoginController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { TokenDto } from './../dto/token-dto';
2
+ import { BaseController, Ok, Unauthorized } from '@spinajs/http';
3
+ import { SessionProvider, User as UserModel } from '@spinajs/rbac';
4
+ import { TwoFactorAuthConfig, TwoFactorAuthProvider } from '../interfaces';
5
+ export declare class TwoFactorAuthController extends BaseController {
6
+ protected TwoFactorConfig: TwoFactorAuthConfig;
7
+ protected SessionProvider: SessionProvider;
8
+ protected TwoFactorAuthProvider: TwoFactorAuthProvider;
9
+ resolveAsync(): Promise<void>;
10
+ verifyToken(logged: UserModel, token: TokenDto, ssid: string): Promise<Ok | Unauthorized>;
11
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.TwoFactorAuthController = void 0;
19
+ const token_dto_1 = require("./../dto/token-dto");
20
+ const http_1 = require("@spinajs/http");
21
+ const rbac_1 = require("@spinajs/rbac");
22
+ const http_2 = require("@spinajs/http");
23
+ const lodash_1 = __importDefault(require("lodash"));
24
+ const decorators_1 = require("../decorators");
25
+ const _2FaPolicy_1 = require("../policies/2FaPolicy");
26
+ const configuration_1 = require("@spinajs/configuration");
27
+ const di_1 = require("@spinajs/di");
28
+ let TwoFactorAuthController = class TwoFactorAuthController extends http_1.BaseController {
29
+ async resolveAsync() {
30
+ if (this.TwoFactorConfig.enabled) {
31
+ if (!di_1.DI.check(this.TwoFactorConfig.service)) {
32
+ throw new di_1.ServiceNotFound(`2FA provider ${this.TwoFactorConfig.service} not registered in DI container`);
33
+ }
34
+ this.TwoFactorAuthProvider = di_1.DI.resolve(this.TwoFactorConfig.service);
35
+ }
36
+ }
37
+ async verifyToken(logged, token, ssid) {
38
+ const result = await this.TwoFactorAuthProvider.verifyToken(token.Token, logged);
39
+ if (result) {
40
+ return new http_1.Unauthorized(`invalid token`);
41
+ }
42
+ const session = await this.SessionProvider.restore(ssid);
43
+ session.Data.set('Authorized', true);
44
+ session.Data.set('2fa_check', true);
45
+ await this.SessionProvider.save(session);
46
+ // return user data
47
+ return new http_1.Ok(lodash_1.default.omit(logged.dehydrate(), ['Id']));
48
+ }
49
+ };
50
+ __decorate([
51
+ (0, configuration_1.Config)('rbac.twoFactorAuth'),
52
+ __metadata("design:type", Object)
53
+ ], TwoFactorAuthController.prototype, "TwoFactorConfig", void 0);
54
+ __decorate([
55
+ (0, di_1.Autoinject)(),
56
+ __metadata("design:type", rbac_1.SessionProvider)
57
+ ], TwoFactorAuthController.prototype, "SessionProvider", void 0);
58
+ __decorate([
59
+ (0, http_1.Post)('2fa/verify'),
60
+ __param(0, (0, decorators_1.User)()),
61
+ __param(1, (0, http_2.Body)()),
62
+ __param(2, (0, http_1.Cookie)()),
63
+ __metadata("design:type", Function),
64
+ __metadata("design:paramtypes", [rbac_1.User, token_dto_1.TokenDto, String]),
65
+ __metadata("design:returntype", Promise)
66
+ ], TwoFactorAuthController.prototype, "verifyToken", null);
67
+ TwoFactorAuthController = __decorate([
68
+ (0, http_1.BasePath)('user/auth'),
69
+ (0, http_2.Policy)(_2FaPolicy_1.TwoFacRouteEnabled)
70
+ ], TwoFactorAuthController);
71
+ exports.TwoFactorAuthController = TwoFactorAuthController;
72
+ //# sourceMappingURL=TwoFactorAuthController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwoFactorAuthController.js","sourceRoot":"","sources":["../../src/controllers/TwoFactorAuthController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,wCAAyF;AACzF,wCAAmE;AACnE,wCAA6C;AAC7C,oDAAuB;AACvB,8CAAqC;AACrC,sDAA2D;AAC3D,0DAAgD;AAEhD,oCAA8D;AAI9D,IAAa,uBAAuB,GAApC,MAAa,uBAAwB,SAAQ,qBAAc;IASlD,KAAK,CAAC,YAAY;QACvB,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;YAChC,IAAI,CAAC,OAAE,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;gBAC3C,MAAM,IAAI,oBAAe,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,OAAO,iCAAiC,CAAC,CAAC;aAC1G;YACD,IAAI,CAAC,qBAAqB,GAAG,OAAE,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACvE;IACH,CAAC;IAGM,KAAK,CAAC,WAAW,CAAS,MAAiB,EAAU,KAAe,EAAY,IAAY;QACjG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjF,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,mBAAY,CAAC,eAAe,CAAC,CAAC;SAC1C;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzC,mBAAmB;QACnB,OAAO,IAAI,SAAE,CAAC,gBAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;CACF,CAAA;AAjCC;IADC,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;gEACkB;AAG/C;IADC,IAAA,eAAU,GAAE;8BACc,sBAAe;gEAAC;AAc3C;IADC,IAAA,WAAI,EAAC,YAAY,CAAC;IACO,WAAA,IAAA,iBAAI,GAAE,CAAA;IAAqB,WAAA,IAAA,WAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,aAAM,GAAE,CAAA;;qCAA7C,WAAS,EAAiB,oBAAQ;;0DAe1E;AAlCU,uBAAuB;IAFnC,IAAA,eAAQ,EAAC,WAAW,CAAC;IACrB,IAAA,aAAM,EAAC,+BAAkB,CAAC;GACd,uBAAuB,CAmCnC;AAnCY,0DAAuB"}
@@ -1,4 +1,5 @@
1
1
  import { PasswordDto } from '../dto/password-dto';
2
+ import { UserLoginDto } from '../dto/login-dto';
2
3
  import { User as UserModel, PasswordProvider, SessionProvider } from '@spinajs/rbac';
3
4
  import { BaseController, Ok } from '@spinajs/http';
4
5
  export declare class UserController extends BaseController {
@@ -6,5 +7,6 @@ export declare class UserController extends BaseController {
6
7
  protected CoockieSecret: string;
7
8
  protected SessionProvider: SessionProvider;
8
9
  refresh(user: UserModel, ssid: string): Promise<Ok>;
10
+ restorePassword(_login: UserLoginDto): Promise<void>;
9
11
  newPassword(login: string, pwd: PasswordDto): Promise<Ok>;
10
12
  }
@@ -40,6 +40,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.UserController = void 0;
42
42
  const password_dto_1 = require("../dto/password-dto");
43
+ const login_dto_1 = require("../dto/login-dto");
43
44
  const rbac_1 = require("@spinajs/rbac");
44
45
  const http_1 = require("@spinajs/http");
45
46
  const exceptions_1 = require("@spinajs/exceptions");
@@ -48,10 +49,12 @@ const decorators_1 = require("../decorators");
48
49
  const configuration_1 = require("@spinajs/configuration");
49
50
  const cs = __importStar(require("cookie-signature"));
50
51
  const lodash_1 = __importDefault(require("lodash"));
52
+ const http_2 = require("@spinajs/http");
51
53
  let UserController = class UserController extends http_1.BaseController {
52
54
  async refresh(user, ssid) {
53
55
  // get user data from db
54
56
  await user.refresh();
57
+ await user.Metadata.populate();
55
58
  // refresh session data from DB
56
59
  const sId = cs.unsign(ssid, this.CoockieSecret);
57
60
  if (sId) {
@@ -62,6 +65,7 @@ let UserController = class UserController extends http_1.BaseController {
62
65
  }
63
66
  return new http_1.Ok(lodash_1.default.omit(user.dehydrate(), ['Id']));
64
67
  }
68
+ async restorePassword(_login) { }
65
69
  async newPassword(login, pwd) {
66
70
  if (pwd.Password !== pwd.ConfirmPassword) {
67
71
  throw new exceptions_1.InvalidArgument('password does not match');
@@ -69,7 +73,7 @@ let UserController = class UserController extends http_1.BaseController {
69
73
  const user = await rbac_1.User.where({ Login: login }).firstOrFail();
70
74
  const isValid = await this.PasswordProvider.verify(user.Password, pwd.OldPassword);
71
75
  if (!isValid) {
72
- throw new exceptions_1.Forbidden('Invalid login or password');
76
+ throw new exceptions_1.Forbidden('old password do not match');
73
77
  }
74
78
  const hashedPassword = await this.PasswordProvider.hash(pwd.Password);
75
79
  user.Password = hashedPassword;
@@ -98,6 +102,13 @@ __decorate([
98
102
  __metadata("design:paramtypes", [rbac_1.User, String]),
99
103
  __metadata("design:returntype", Promise)
100
104
  ], UserController.prototype, "refresh", null);
105
+ __decorate([
106
+ (0, http_2.Post)('password/restore'),
107
+ __param(0, (0, http_1.Body)()),
108
+ __metadata("design:type", Function),
109
+ __metadata("design:paramtypes", [login_dto_1.UserLoginDto]),
110
+ __metadata("design:returntype", Promise)
111
+ ], UserController.prototype, "restorePassword", null);
101
112
  __decorate([
102
113
  (0, http_1.Patch)('/password/:login'),
103
114
  __param(0, (0, http_1.Param)()),
@@ -1 +1 @@
1
- {"version":3,"file":"UserController.js","sourceRoot":"","sources":["../../src/controllers/UserController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAkD;AAClD,wCAAqF;AACrF,wCAA8F;AAC9F,oDAAiE;AACjE,oCAAyC;AACzC,8CAA2D;AAC3D,0DAAgD;AAChD,qDAAuC;AACvC,oDAAuB;AAIvB,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,qBAAc;IAYzC,KAAK,CAAC,OAAO,CAAS,IAAe,EAAY,IAAY;QAClE,wBAAwB;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,+BAA+B;QAC/B,MAAM,GAAG,GAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,IAAI,GAAG,EAAE;YACP,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;aAC5C;SACF;QAED,OAAO,IAAI,SAAE,CAAC,gBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAGM,KAAK,CAAC,WAAW,CAAU,KAAa,EAAU,GAAgB;QACvE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,eAAe,EAAE;YACxC,MAAM,IAAI,4BAAe,CAAC,yBAAyB,CAAC,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,MAAM,WAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAEnF,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,sBAAS,CAAC,2BAA2B,CAAC,CAAC;SAClD;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;QAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,SAAE,EAAE,CAAC;IAClB,CAAC;CACF,CAAA;AA5CC;IADC,IAAA,eAAU,GAAE;8BACe,uBAAgB;wDAAC;AAG7C;IADC,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;qDACG;AAGhC;IADC,IAAA,eAAU,GAAE;8BACc,sBAAe;uDAAC;AAI3C;IAFC,IAAA,UAAG,GAAE;IACL,IAAA,uBAAU,EAAC,SAAS,CAAC;IACA,WAAA,IAAA,iBAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,aAAM,GAAE,CAAA;;qCAApB,WAAS;;6CAc3C;AAGD;IADC,IAAA,YAAK,EAAC,kBAAkB,CAAC;IACA,WAAA,IAAA,YAAK,GAAE,CAAA;IAAiB,WAAA,IAAA,WAAI,GAAE,CAAA;;6CAAM,0BAAW;;iDAgBxE;AA7CU,cAAc;IAF1B,IAAA,eAAQ,EAAC,MAAM,CAAC;IAChB,IAAA,qBAAQ,EAAC,MAAM,CAAC;GACJ,cAAc,CA8C1B;AA9CY,wCAAc"}
1
+ {"version":3,"file":"UserController.js","sourceRoot":"","sources":["../../src/controllers/UserController.ts"],"names":[],"mappings":"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"}
package/lib/decorators.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Session = exports.User = exports.Permission = exports.Resource = exports.setRbacMetadata = exports.ACL_CONTROLLER_DESCRIPTOR = void 0;
4
4
  const http_1 = require("@spinajs/http");
5
- const policies_1 = require("./policies");
5
+ const RbacPolicy_1 = require("./policies/RbacPolicy");
6
6
  exports.ACL_CONTROLLER_DESCRIPTOR = Symbol('ACL_CONTROLLER_DESCRIPTOR_SYMBOL');
7
7
  function setRbacMetadata(target, callback) {
8
8
  let metadata = Reflect.getMetadata(exports.ACL_CONTROLLER_DESCRIPTOR, target.prototype || target);
@@ -43,7 +43,7 @@ function descriptor(callback) {
43
43
  */
44
44
  function Resource(resource, permission = 'readOwn') {
45
45
  return descriptor((metadata, target) => {
46
- (0, http_1.Policy)(policies_1.RbacPolicy)(target, null, null);
46
+ (0, http_1.Policy)(RbacPolicy_1.RbacPolicy)(target, null, null);
47
47
  metadata.Resource = resource;
48
48
  metadata.Permission = permission;
49
49
  });
@@ -69,7 +69,7 @@ function Permission(permission = 'readOwn') {
69
69
  }
70
70
  metadata.Routes.set(propertyKey, route);
71
71
  }
72
- (0, http_1.Policy)(policies_1.RbacPolicy)(target, propertyKey, null);
72
+ (0, http_1.Policy)(RbacPolicy_1.RbacPolicy)(target, propertyKey, null);
73
73
  });
74
74
  }
75
75
  exports.Permission = Permission;
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
@@ -7,15 +7,10 @@ export declare const LoginDtoSchema: {
7
7
  type: string;
8
8
  format: string;
9
9
  };
10
- Password: {
11
- type: string;
12
- maxLength: number;
13
- };
14
10
  };
15
11
  required: string[];
16
12
  };
17
- export declare class LoginDto {
13
+ export declare class UserLoginDto {
18
14
  Email: string;
19
- Password: string;
20
15
  constructor(data: any);
21
16
  }
@@ -9,26 +9,25 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.LoginDto = exports.LoginDtoSchema = void 0;
12
+ exports.UserLoginDto = exports.LoginDtoSchema = void 0;
13
13
  const validation_1 = require("@spinajs/validation");
14
14
  exports.LoginDtoSchema = {
15
15
  $schema: 'http://json-schema.org/draft-07/schema#',
16
- title: 'User login DTO',
16
+ title: 'login DTO',
17
17
  type: 'object',
18
18
  properties: {
19
19
  Login: { type: 'string', format: 'email' },
20
- Password: { type: 'string', maxLength: 32 },
21
20
  },
22
- required: ['Email', 'Password'],
21
+ required: ['Email'],
23
22
  };
24
- let LoginDto = class LoginDto {
23
+ let UserLoginDto = class UserLoginDto {
25
24
  constructor(data) {
26
25
  Object.assign(this, data);
27
26
  }
28
27
  };
29
- LoginDto = __decorate([
28
+ UserLoginDto = __decorate([
30
29
  (0, validation_1.Schema)(exports.LoginDtoSchema),
31
30
  __metadata("design:paramtypes", [Object])
32
- ], LoginDto);
33
- exports.LoginDto = LoginDto;
31
+ ], UserLoginDto);
32
+ exports.UserLoginDto = UserLoginDto;
34
33
  //# sourceMappingURL=login-dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login-dto.js","sourceRoot":"","sources":["../../src/dto/login-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,gBAAgB;IACvB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;KAC5C;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;CAChC,CAAC;AAGF,IAAa,QAAQ,GAArB,MAAa,QAAQ;IAKnB,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AARY,QAAQ;IADpB,IAAA,mBAAM,EAAC,sBAAc,CAAC;;GACV,QAAQ,CAQpB;AARY,4BAAQ"}
1
+ {"version":3,"file":"login-dto.js","sourceRoot":"","sources":["../../src/dto/login-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;KAC3C;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAGF,IAAa,YAAY,GAAzB,MAAa,YAAY;IAGvB,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AANY,YAAY;IADxB,IAAA,mBAAM,EAAC,sBAAc,CAAC;;GACV,YAAY,CAMxB;AANY,oCAAY"}
@@ -0,0 +1,15 @@
1
+ export declare const TokenDtoSchema: {
2
+ $schema: string;
3
+ title: string;
4
+ type: string;
5
+ properties: {
6
+ Token: {
7
+ type: string;
8
+ maxLength: number;
9
+ };
10
+ };
11
+ };
12
+ export declare class TokenDto {
13
+ Token: string;
14
+ constructor(data: any);
15
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TokenDto = exports.TokenDtoSchema = void 0;
13
+ const validation_1 = require("@spinajs/validation");
14
+ exports.TokenDtoSchema = {
15
+ $schema: 'http://json-schema.org/draft-07/schema#',
16
+ title: 'Token DTO',
17
+ type: 'object',
18
+ properties: {
19
+ Token: { type: 'string', maxLength: 64 },
20
+ },
21
+ };
22
+ let TokenDto = class TokenDto {
23
+ constructor(data) {
24
+ Object.assign(this, data);
25
+ }
26
+ };
27
+ TokenDto = __decorate([
28
+ (0, validation_1.Schema)(exports.TokenDtoSchema),
29
+ __metadata("design:paramtypes", [Object])
30
+ ], TokenDto);
31
+ exports.TokenDto = TokenDto;
32
+ //# sourceMappingURL=token-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-dto.js","sourceRoot":"","sources":["../../src/dto/token-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAChC,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;KACzC;CACF,CAAC;AAGF,IAAa,QAAQ,GAArB,MAAa,QAAQ;IAGnB,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AANY,QAAQ;IADpB,IAAA,mBAAM,EAAC,sBAAc,CAAC;;GACV,QAAQ,CAMpB;AANY,4BAAQ"}
@@ -0,0 +1,21 @@
1
+ export declare const UserLoginDtoSchema: {
2
+ $schema: string;
3
+ title: string;
4
+ type: string;
5
+ properties: {
6
+ Login: {
7
+ type: string;
8
+ format: string;
9
+ };
10
+ Password: {
11
+ type: string;
12
+ maxLength: number;
13
+ };
14
+ };
15
+ required: string[];
16
+ };
17
+ export declare class UserLoginDto {
18
+ Email: string;
19
+ Password: string;
20
+ constructor(data: any);
21
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UserLoginDto = exports.UserLoginDtoSchema = void 0;
13
+ const validation_1 = require("@spinajs/validation");
14
+ exports.UserLoginDtoSchema = {
15
+ $schema: 'http://json-schema.org/draft-07/schema#',
16
+ title: 'User login DTO',
17
+ type: 'object',
18
+ properties: {
19
+ Login: { type: 'string', format: 'email' },
20
+ Password: { type: 'string', maxLength: 32 },
21
+ },
22
+ required: ['Email', 'Password'],
23
+ };
24
+ let UserLoginDto = class UserLoginDto {
25
+ constructor(data) {
26
+ Object.assign(this, data);
27
+ }
28
+ };
29
+ UserLoginDto = __decorate([
30
+ (0, validation_1.Schema)(exports.UserLoginDtoSchema),
31
+ __metadata("design:paramtypes", [Object])
32
+ ], UserLoginDto);
33
+ exports.UserLoginDto = UserLoginDto;
34
+ //# sourceMappingURL=userLogin-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userLogin-dto.js","sourceRoot":"","sources":["../../src/dto/userLogin-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,kBAAkB,GAAG;IAChC,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,gBAAgB;IACvB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;KAC5C;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;CAChC,CAAC;AAGF,IAAa,YAAY,GAAzB,MAAa,YAAY;IAKvB,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AARY,YAAY;IADxB,IAAA,mBAAM,EAAC,0BAAkB,CAAC;;GACd,YAAY,CAQxB;AARY,oCAAY"}
package/lib/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from './decorators';
2
2
  export * from './interfaces';
3
3
  export * from './middlewares';
4
- export * from './policies';
4
+ export * from './policies/RbacPolicy';
5
5
  export * from './controllers/LoginController';
6
6
  export * from './controllers/UserController';
7
7
  export * from './transformers';
package/lib/index.js CHANGED
@@ -17,7 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./decorators"), exports);
18
18
  __exportStar(require("./interfaces"), exports);
19
19
  __exportStar(require("./middlewares"), exports);
20
- __exportStar(require("./policies"), exports);
20
+ __exportStar(require("./policies/RbacPolicy"), exports);
21
21
  __exportStar(require("./controllers/LoginController"), exports);
22
22
  __exportStar(require("./controllers/UserController"), exports);
23
23
  __exportStar(require("./transformers"), exports);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B;AAC7B,gDAA8B;AAC9B,6CAA2B;AAC3B,gEAA8C;AAC9C,+DAA6C;AAC7C,iDAA+B;AAC/B,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B;AAC7B,gDAA8B;AAC9B,wDAAsC;AACtC,gEAA8C;AAC9C,+DAA6C;AAC7C,iDAA+B;AAC/B,+CAA6B"}
@@ -28,3 +28,40 @@ export interface IRbacRoutePermissionDescriptor {
28
28
  */
29
29
  Permission: PermissionType;
30
30
  }
31
+ export declare abstract class TwoFactorAuthProvider {
32
+ /**
33
+ * generate secret key if this provider use is needs it or null
34
+ */
35
+ abstract initialize(user: User): Promise<any | null>;
36
+ /**
37
+ * Perform action eg. send sms or email. Some 2fac implementations do nothing eg. google auth or hardware keys
38
+ */
39
+ abstract execute(user: User): Promise<void>;
40
+ /**
41
+ * verifies token send by user
42
+ */
43
+ abstract verifyToken(token: string, user: User): Promise<boolean>;
44
+ /**
45
+ * Checks if 2fa is enabled for given user
46
+ */
47
+ abstract isEnabled(user: User): Promise<boolean>;
48
+ /**
49
+ * Checks if 2fa is initialized eg. some
50
+ * 2fa systems requires to generate private software key and pass it
51
+ * to user ( like google authenticator)
52
+ */
53
+ abstract isInitialized(user: User): Promise<boolean>;
54
+ }
55
+ export declare abstract class FingerprintProvider {
56
+ }
57
+ export interface AuthProvider {
58
+ }
59
+ export interface TwoFactorAuthConfig {
60
+ enabled: boolean;
61
+ service: string;
62
+ }
63
+ export interface FingerpringConfig {
64
+ enabled: boolean;
65
+ maxDevices: number;
66
+ service: string;
67
+ }
package/lib/interfaces.js CHANGED
@@ -1,3 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FingerprintProvider = exports.TwoFactorAuthProvider = void 0;
4
+ class TwoFactorAuthProvider {
5
+ }
6
+ exports.TwoFactorAuthProvider = TwoFactorAuthProvider;
7
+ class FingerprintProvider {
8
+ }
9
+ exports.FingerprintProvider = FingerprintProvider;
3
10
  //# sourceMappingURL=interfaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AAqCA,MAAsB,qBAAqB;CA2B1C;AA3BD,sDA2BC;AAED,MAAsB,mBAAmB;CAAG;AAA5C,kDAA4C"}
@@ -0,0 +1,7 @@
1
+ import { BasePolicy } from '@spinajs/http';
2
+ import { TwoFactorAuthConfig } from '../interfaces';
3
+ export declare class TwoFacRouteEnabled extends BasePolicy {
4
+ protected TwoFactorConfig: TwoFactorAuthConfig;
5
+ isEnabled(): boolean;
6
+ execute(): Promise<void>;
7
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TwoFacRouteEnabled = void 0;
13
+ const exceptions_1 = require("@spinajs/exceptions");
14
+ const configuration_1 = require("@spinajs/configuration");
15
+ const http_1 = require("@spinajs/http");
16
+ class TwoFacRouteEnabled extends http_1.BasePolicy {
17
+ isEnabled() {
18
+ return true;
19
+ }
20
+ execute() {
21
+ if (this.TwoFactorConfig.enabled === false) {
22
+ throw new exceptions_1.InvalidOperation('2 factor auth is not enabled');
23
+ }
24
+ return Promise.resolve();
25
+ }
26
+ }
27
+ __decorate([
28
+ (0, configuration_1.Config)('rbac.twoFactorAuth'),
29
+ __metadata("design:type", Object)
30
+ ], TwoFacRouteEnabled.prototype, "TwoFactorConfig", void 0);
31
+ exports.TwoFacRouteEnabled = TwoFacRouteEnabled;
32
+ //# sourceMappingURL=2FaPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2FaPolicy.js","sourceRoot":"","sources":["../../src/policies/2FaPolicy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAuD;AACvD,0DAAgD;AAChD,wCAA2C;AAG3C,MAAa,kBAAmB,SAAQ,iBAAU;IAIzC,SAAS;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACM,OAAO;QACZ,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,KAAK,KAAK,EAAE;YAC1C,MAAM,IAAI,6BAAgB,CAAC,8BAA8B,CAAC,CAAC;SAC5D;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAZC;IADC,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;2DACkB;AAFjD,gDAcC"}
@@ -0,0 +1,9 @@
1
+ import { BasePolicy, IController, IRoute, Request as sRequest } from '@spinajs/http';
2
+ /**
3
+ * Simple policy to only check if user is authorized ( do not check permissions for routes)
4
+ * Usefull if we want to give acces for all logged users
5
+ */
6
+ export declare class AuthPolicy extends BasePolicy {
7
+ isEnabled(_action: IRoute, _instance: IController): boolean;
8
+ execute(req: sRequest): Promise<void>;
9
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthPolicy = void 0;
4
+ const http_1 = require("@spinajs/http");
5
+ const exceptions_1 = require("@spinajs/exceptions");
6
+ /**
7
+ * Simple policy to only check if user is authorized ( do not check permissions for routes)
8
+ * Usefull if we want to give acces for all logged users
9
+ */
10
+ class AuthPolicy extends http_1.BasePolicy {
11
+ isEnabled(_action, _instance) {
12
+ // acl is always on if set
13
+ return true;
14
+ }
15
+ async execute(req) {
16
+ if (!req.storage || !req.storage.user || !req.storage.session.Data.get('Authorized')) {
17
+ throw new exceptions_1.Forbidden('user not logged or session expired');
18
+ }
19
+ return Promise.resolve();
20
+ }
21
+ }
22
+ exports.AuthPolicy = AuthPolicy;
23
+ //# sourceMappingURL=AuthPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthPolicy.js","sourceRoot":"","sources":["../../src/policies/AuthPolicy.ts"],"names":[],"mappings":";;;AAAA,wCAAqF;AACrF,oDAAgD;AAEhD;;;GAGG;AACH,MAAa,UAAW,SAAQ,iBAAU;IACjC,SAAS,CAAC,OAAe,EAAE,SAAsB;QACtD,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAa;QAChC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACpF,MAAM,IAAI,sBAAS,CAAC,oCAAoC,CAAC,CAAC;SAC3D;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAbD,gCAaC"}
@@ -0,0 +1,15 @@
1
+ import { AccessControl, Permission } from 'accesscontrol';
2
+ import { BasePolicy, IController, IRoute, Request as sRequest } from '@spinajs/http';
3
+ import { User } from '@spinajs/rbac';
4
+ /**
5
+ * Checks if user is logged, authorized & have proper permissions
6
+ */
7
+ export declare class RbacPolicy extends BasePolicy {
8
+ protected Ac: AccessControl;
9
+ constructor();
10
+ isEnabled(_action: IRoute, _instance: IController): boolean;
11
+ execute(req: sRequest, action: IRoute, instance: IController): Promise<void>;
12
+ }
13
+ export declare function checkRbacPermission(role: string | string[], resource: string, permission: string): Permission;
14
+ export declare function checkUserPermission(user: User, resource: string, permission: string): Permission;
15
+ export declare function checkRoutePermission(req: sRequest, resource: string, permission: string): Permission;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkRoutePermission = exports.checkUserPermission = exports.checkRbacPermission = exports.RbacPolicy = void 0;
4
+ const http_1 = require("@spinajs/http");
5
+ const exceptions_1 = require("@spinajs/exceptions");
6
+ const decorators_1 = require("../decorators");
7
+ const di_1 = require("@spinajs/di");
8
+ /**
9
+ * Checks if user is logged, authorized & have proper permissions
10
+ */
11
+ class RbacPolicy extends http_1.BasePolicy {
12
+ constructor() {
13
+ super();
14
+ this.Ac = di_1.DI.get('AccessControl');
15
+ }
16
+ isEnabled(_action, _instance) {
17
+ // acl is always on if set
18
+ return true;
19
+ }
20
+ async execute(req, action, instance) {
21
+ var _a, _b;
22
+ const descriptor = Reflect.getMetadata(decorators_1.ACL_CONTROLLER_DESCRIPTOR, instance);
23
+ let permission = (_a = descriptor.Permission) !== null && _a !== void 0 ? _a : '';
24
+ // check if route has its own permission
25
+ if (descriptor.Routes.has(action.Method)) {
26
+ permission = (_b = descriptor.Routes.get(action.Method).Permission) !== null && _b !== void 0 ? _b : '';
27
+ }
28
+ if (!descriptor || !descriptor.Permission) {
29
+ throw new exceptions_1.Forbidden(`no route permission or resources assigned`);
30
+ }
31
+ if (!req.storage || !req.storage.user || !req.storage.session.Data.get('Authorized')) {
32
+ throw new exceptions_1.Forbidden('user not logged or session expired');
33
+ }
34
+ if (!checkRoutePermission(req, descriptor.Resource, permission).granted) {
35
+ throw new exceptions_1.Forbidden(`role(s) ${req.storage.user.Role} does not have permission ${permission} for resource ${descriptor.Resource}`);
36
+ }
37
+ }
38
+ }
39
+ exports.RbacPolicy = RbacPolicy;
40
+ function checkRbacPermission(role, resource, permission) {
41
+ const ac = di_1.DI.get('AccessControl');
42
+ return ac.can(role)[permission](resource);
43
+ }
44
+ exports.checkRbacPermission = checkRbacPermission;
45
+ function checkUserPermission(user, resource, permission) {
46
+ const ac = di_1.DI.get('AccessControl');
47
+ if (!user) {
48
+ return null;
49
+ }
50
+ return ac.can(user.Role)[permission](resource);
51
+ }
52
+ exports.checkUserPermission = checkUserPermission;
53
+ function checkRoutePermission(req, resource, permission) {
54
+ if (!req.storage || !req.storage.user) {
55
+ return null;
56
+ }
57
+ return checkUserPermission(req.storage.user, resource, permission);
58
+ }
59
+ exports.checkRoutePermission = checkRoutePermission;
60
+ //# sourceMappingURL=RbacPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RbacPolicy.js","sourceRoot":"","sources":["../../src/policies/RbacPolicy.ts"],"names":[],"mappings":";;;AACA,wCAAqF;AACrF,oDAAgD;AAChD,8CAA0D;AAE1D,oCAAiC;AAGjC;;GAEG;AACH,MAAa,UAAW,SAAQ,iBAAU;IAGxC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,OAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,OAAe,EAAE,SAAsB;QACtD,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAa,EAAE,MAAc,EAAE,QAAqB;;QACvE,MAAM,UAAU,GAAoB,OAAO,CAAC,WAAW,CAAC,sCAAyB,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,EAAE,CAAC;QAE7C,wCAAwC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACxC,UAAU,GAAG,MAAA,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,mCAAI,EAAE,CAAC;SACpE;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YACzC,MAAM,IAAI,sBAAS,CAAC,2CAA2C,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACpF,MAAM,IAAI,sBAAS,CAAC,oCAAoC,CAAC,CAAC;SAC3D;QAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE;YACvE,MAAM,IAAI,sBAAS,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,6BAA6B,UAAU,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SACpI;IACH,CAAC;CACF;AAnCD,gCAmCC;AAED,SAAgB,mBAAmB,CAAC,IAAuB,EAAE,QAAgB,EAAE,UAAkB;IAC/F,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAClD,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAHD,kDAGC;AAED,SAAgB,mBAAmB,CAAC,IAAU,EAAE,QAAgB,EAAE,UAAkB;IAClF,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAC;KACb;IAED,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC1D,CAAC;AARD,kDAQC;AAED,SAAgB,oBAAoB,CAAC,GAAa,EAAE,QAAgB,EAAE,UAAkB;IACtF,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QACrC,OAAO,IAAI,CAAC;KACb;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACrE,CAAC;AAND,oDAMC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spinajs/rbac-http",
3
- "version": "2.0.26",
3
+ "version": "2.0.38",
4
4
  "description": "HTTP API for user session & permissions",
5
5
  "main": "lib/index.js",
6
6
  "private": false,
@@ -38,20 +38,24 @@
38
38
  },
39
39
  "homepage": "https://github.com/spinajs/main#readme",
40
40
  "dependencies": {
41
- "@spinajs/configuration": "^2.0.19",
42
- "@spinajs/di": "^2.0.19",
41
+ "@spinajs/configuration": "^2.0.38",
42
+ "@spinajs/di": "^2.0.38",
43
43
  "@spinajs/exceptions": "^2.0.12",
44
- "@spinajs/http": "^2.0.25",
45
- "@spinajs/log": "^2.0.19",
46
- "@spinajs/orm": "^2.0.19",
47
- "@spinajs/orm-http": "^2.0.26",
48
- "@spinajs/rbac": "^2.0.26",
49
- "@spinajs/reflection": "^2.0.19",
44
+ "@spinajs/http": "^2.0.38",
45
+ "@spinajs/log": "^2.0.38",
46
+ "@spinajs/orm": "^2.0.38",
47
+ "@spinajs/orm-http": "^2.0.38",
48
+ "@spinajs/rbac": "^2.0.38",
49
+ "@spinajs/reflection": "^2.0.38",
50
50
  "accesscontrol": "^2.2.1",
51
- "luxon": "^2.4.0"
51
+ "luxon": "^2.4.0",
52
+ "qrcode": "^1.5.1",
53
+ "speakeasy": "^2.0.0"
52
54
  },
53
55
  "devDependencies": {
54
- "@spinajs/orm-sqlite": "^2.0.26"
56
+ "@spinajs/orm-sqlite": "^2.0.38",
57
+ "@types/qrcode": "^1.4.2",
58
+ "@types/speakeasy": "^2.0.7"
55
59
  },
56
- "gitHead": "6cc486b8c6d95f3632767f2796496f9807487508"
60
+ "gitHead": "5ea5440ee9db49595f531592ebdbc6d69f457082"
57
61
  }