@spinajs/rbac-http-user 2.0.481 → 2.0.484
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/lib/cjs/actions/2fa.d.ts +6 -0
- package/lib/cjs/actions/2fa.d.ts.map +1 -1
- package/lib/cjs/actions/2fa.js +18 -4
- package/lib/cjs/actions/2fa.js.map +1 -1
- package/lib/cjs/controllers/ActiveRoleController.d.ts +1 -0
- package/lib/cjs/controllers/ActiveRoleController.d.ts.map +1 -1
- package/lib/cjs/controllers/ActiveRoleController.js +21 -2
- package/lib/cjs/controllers/ActiveRoleController.js.map +1 -1
- package/lib/cjs/controllers/LoginController.d.ts +1 -1
- package/lib/cjs/controllers/LoginController.d.ts.map +1 -1
- package/lib/cjs/controllers/LoginController.js +32 -24
- package/lib/cjs/controllers/LoginController.js.map +1 -1
- package/lib/cjs/controllers/TwoFactorAuthController.d.ts +7 -0
- package/lib/cjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
- package/lib/cjs/controllers/TwoFactorAuthController.js +36 -5
- package/lib/cjs/controllers/TwoFactorAuthController.js.map +1 -1
- package/lib/cjs/controllers/UserController.d.ts.map +1 -1
- package/lib/cjs/controllers/UserController.js +5 -1
- package/lib/cjs/controllers/UserController.js.map +1 -1
- package/lib/cjs/controllers/UserMetadataController.d.ts +5 -5
- package/lib/cjs/controllers/UserMetadataController.d.ts.map +1 -1
- package/lib/cjs/controllers/UserMetadataController.js +59 -30
- package/lib/cjs/controllers/UserMetadataController.js.map +1 -1
- package/lib/cjs/models/FilterableUserMetadata.d.ts +1 -0
- package/lib/cjs/models/FilterableUserMetadata.d.ts.map +1 -1
- package/lib/cjs/models/FilterableUserMetadata.js +8 -1
- package/lib/cjs/models/FilterableUserMetadata.js.map +1 -1
- package/lib/mjs/actions/2fa.d.ts +6 -0
- package/lib/mjs/actions/2fa.d.ts.map +1 -1
- package/lib/mjs/actions/2fa.js +18 -4
- package/lib/mjs/actions/2fa.js.map +1 -1
- package/lib/mjs/controllers/ActiveRoleController.d.ts +1 -0
- package/lib/mjs/controllers/ActiveRoleController.d.ts.map +1 -1
- package/lib/mjs/controllers/ActiveRoleController.js +22 -3
- package/lib/mjs/controllers/ActiveRoleController.js.map +1 -1
- package/lib/mjs/controllers/LoginController.d.ts +1 -1
- package/lib/mjs/controllers/LoginController.d.ts.map +1 -1
- package/lib/mjs/controllers/LoginController.js +33 -25
- package/lib/mjs/controllers/LoginController.js.map +1 -1
- package/lib/mjs/controllers/TwoFactorAuthController.d.ts +7 -0
- package/lib/mjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
- package/lib/mjs/controllers/TwoFactorAuthController.js +38 -7
- package/lib/mjs/controllers/TwoFactorAuthController.js.map +1 -1
- package/lib/mjs/controllers/UserController.d.ts.map +1 -1
- package/lib/mjs/controllers/UserController.js +5 -1
- package/lib/mjs/controllers/UserController.js.map +1 -1
- package/lib/mjs/controllers/UserMetadataController.d.ts +5 -5
- package/lib/mjs/controllers/UserMetadataController.d.ts.map +1 -1
- package/lib/mjs/controllers/UserMetadataController.js +60 -31
- package/lib/mjs/controllers/UserMetadataController.js.map +1 -1
- package/lib/mjs/models/FilterableUserMetadata.d.ts +1 -0
- package/lib/mjs/models/FilterableUserMetadata.d.ts.map +1 -1
- package/lib/mjs/models/FilterableUserMetadata.js +8 -1
- package/lib/mjs/models/FilterableUserMetadata.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +19 -20
|
@@ -20,6 +20,12 @@ const orm_http_1 = require("@spinajs/orm-http");
|
|
|
20
20
|
const metadata_dto_js_1 = require("../dto/metadata-dto.js");
|
|
21
21
|
const orm_1 = require("@spinajs/orm");
|
|
22
22
|
const FilterableUserMetadata_js_1 = require("../models/FilterableUserMetadata.js");
|
|
23
|
+
/**
|
|
24
|
+
* Fallback page size. A request without a `limit` used to reach `take(0)`,
|
|
25
|
+
* which the query builder rejects ( "take count should be a positive number" ),
|
|
26
|
+
* so plain listing requests failed instead of returning the first page.
|
|
27
|
+
*/
|
|
28
|
+
const DEFAULT_PAGE_SIZE = 10;
|
|
23
29
|
/**
|
|
24
30
|
* User metadata management.
|
|
25
31
|
* Provides CRUD operations for key-value metadata entries attached to user accounts.
|
|
@@ -43,11 +49,12 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
43
49
|
* @response 404 User not found
|
|
44
50
|
*/
|
|
45
51
|
async readUserMeta(user, pagination, order, filter) {
|
|
52
|
+
const limit = pagination?.limit || DEFAULT_PAGE_SIZE;
|
|
46
53
|
return new http_1.Ok(FilterableUserMetadata_js_1.FilterableUserMetadata.select().where({
|
|
47
54
|
user_id: user.Id
|
|
48
55
|
}).filter(filter?.filters ?? [], filter?.op)
|
|
49
|
-
.take(
|
|
50
|
-
.skip(
|
|
56
|
+
.take(limit)
|
|
57
|
+
.skip(limit * (pagination?.page ?? 0))
|
|
51
58
|
.order(order?.column ?? 'Id', order?.order ?? orm_1.SortOrder.DESC));
|
|
52
59
|
}
|
|
53
60
|
/**
|
|
@@ -114,10 +121,10 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
114
121
|
* @response 404 User or metadata entry not found
|
|
115
122
|
*/
|
|
116
123
|
async deleteUserMetadata(user, meta) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
124
|
+
// NOTE: destroy() refuses to build an unbounded DELETE, so the entry id
|
|
125
|
+
// goes in as the primary key and ownership is AND-ed on top of it —
|
|
126
|
+
// deleting by id alone would let any user id delete anybody's entry.
|
|
127
|
+
await rbac_1.UserMetadata.destroy(meta).andWhere('user_id', user.Id);
|
|
121
128
|
return new http_1.Ok();
|
|
122
129
|
}
|
|
123
130
|
/**
|
|
@@ -144,10 +151,15 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
144
151
|
* @response 401 Unauthorized — valid session required
|
|
145
152
|
* @response 403 Forbidden — readOwn permission required
|
|
146
153
|
*/
|
|
147
|
-
async readMeta(pagination, order, filter) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
async readMeta(user, pagination, order, filter) {
|
|
155
|
+
// Explicit owner scoping: the rbac query middleware does not enforce
|
|
156
|
+
// ownership for the metadata model (queries resolve to the unsafe base
|
|
157
|
+
// model without an @OrmResource), so every own-route filters by the
|
|
158
|
+
// authenticated user's id directly.
|
|
159
|
+
const limit = pagination?.limit || DEFAULT_PAGE_SIZE;
|
|
160
|
+
return new http_1.Ok(FilterableUserMetadata_js_1.FilterableUserMetadata.select().where('user_id', user.Id).filter(filter?.filters ?? [], filter?.op)
|
|
161
|
+
.take(limit)
|
|
162
|
+
.skip(limit * (pagination?.page ?? 0))
|
|
151
163
|
.order(order?.column ?? 'Id', order?.order ?? orm_1.SortOrder.DESC));
|
|
152
164
|
}
|
|
153
165
|
/**
|
|
@@ -160,9 +172,10 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
160
172
|
* @response 403 Forbidden — readOwn permission required
|
|
161
173
|
* @response 404 Metadata key not found
|
|
162
174
|
*/
|
|
163
|
-
async getMeta(key) {
|
|
175
|
+
async getMeta(user, key) {
|
|
164
176
|
return new http_1.Ok(rbac_1.UserMetadata.where({
|
|
165
177
|
Key: key,
|
|
178
|
+
user_id: user.Id,
|
|
166
179
|
}).firstOrFail());
|
|
167
180
|
}
|
|
168
181
|
/**
|
|
@@ -173,8 +186,12 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
173
186
|
* @response 401 Unauthorized — valid session required
|
|
174
187
|
* @response 403 Forbidden — updateOwn permission required
|
|
175
188
|
*/
|
|
176
|
-
async addMetadata(metadata) {
|
|
189
|
+
async addMetadata(user, metadata) {
|
|
190
|
+
// force ownership to the authenticated user — never trust a user_id
|
|
191
|
+
// supplied in the request body
|
|
192
|
+
metadata.user_id = user.Id;
|
|
177
193
|
await metadata.insert(orm_1.InsertBehaviour.InsertOrUpdate);
|
|
194
|
+
return new http_1.Ok();
|
|
178
195
|
}
|
|
179
196
|
/**
|
|
180
197
|
* Update own metadata entry
|
|
@@ -187,12 +204,20 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
187
204
|
* @response 403 Forbidden — updateOwn permission required
|
|
188
205
|
* @response 404 Metadata entry not found
|
|
189
206
|
*/
|
|
190
|
-
async updateMetadata(meta, data) {
|
|
207
|
+
async updateMetadata(user, meta, data) {
|
|
208
|
+
// The Key/Id lookup is grouped and AND-ed with an explicit ownership
|
|
209
|
+
// filter. Without the grouping the flat "Key = ? OR Id = ? AND user_id = ?"
|
|
210
|
+
// binds as "Key = ? OR (Id = ? AND user_id = ?)", letting any user update
|
|
211
|
+
// another user's metadata by its Key. Scoping by user_id explicitly (not
|
|
212
|
+
// relying on the query middleware, which does not fire for this model)
|
|
213
|
+
// keeps the update owner-bound.
|
|
191
214
|
await rbac_1.UserMetadata.update({
|
|
192
215
|
Key: data.Key,
|
|
193
216
|
Value: data.Value,
|
|
194
217
|
Type: data.Type
|
|
195
|
-
}).where(
|
|
218
|
+
}).where(function () {
|
|
219
|
+
this.where("Key", meta).orWhere("Id", meta);
|
|
220
|
+
}).andWhere('user_id', user.Id);
|
|
196
221
|
return new http_1.Ok();
|
|
197
222
|
}
|
|
198
223
|
/**
|
|
@@ -205,10 +230,8 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
|
|
|
205
230
|
* @response 403 Forbidden — deleteOwn permission required
|
|
206
231
|
* @response 404 Metadata entry not found
|
|
207
232
|
*/
|
|
208
|
-
async deleteMetadata(meta) {
|
|
209
|
-
await rbac_1.UserMetadata.destroy().
|
|
210
|
-
Id: meta
|
|
211
|
-
});
|
|
233
|
+
async deleteMetadata(user, meta) {
|
|
234
|
+
await rbac_1.UserMetadata.destroy(meta).andWhere('user_id', user.Id);
|
|
212
235
|
return new http_1.Ok();
|
|
213
236
|
}
|
|
214
237
|
};
|
|
@@ -275,45 +298,51 @@ __decorate([
|
|
|
275
298
|
__decorate([
|
|
276
299
|
(0, http_1.Get)("metadata"),
|
|
277
300
|
(0, rbac_http_1.Permission)(['readOwn']),
|
|
278
|
-
__param(0, (0,
|
|
301
|
+
__param(0, (0, rbac_http_1.User)()),
|
|
279
302
|
__param(1, (0, http_1.Query)()),
|
|
280
|
-
__param(2, (0,
|
|
303
|
+
__param(2, (0, http_1.Query)()),
|
|
304
|
+
__param(3, (0, orm_http_1.Filter)(FilterableUserMetadata_js_1.FilterableUserMetadata)),
|
|
281
305
|
__metadata("design:type", Function),
|
|
282
|
-
__metadata("design:paramtypes", [
|
|
306
|
+
__metadata("design:paramtypes", [rbac_1.User,
|
|
307
|
+
orm_http_1.PaginationDTO,
|
|
283
308
|
orm_http_1.OrderDTO, Object]),
|
|
284
309
|
__metadata("design:returntype", Promise)
|
|
285
310
|
], UserMetadataController.prototype, "readMeta", null);
|
|
286
311
|
__decorate([
|
|
287
312
|
(0, http_1.Get)("metadata/:key"),
|
|
288
313
|
(0, rbac_http_1.Permission)(['readOwn']),
|
|
289
|
-
__param(0, (0,
|
|
314
|
+
__param(0, (0, rbac_http_1.User)()),
|
|
315
|
+
__param(1, (0, http_1.Param)()),
|
|
290
316
|
__metadata("design:type", Function),
|
|
291
|
-
__metadata("design:paramtypes", [String]),
|
|
317
|
+
__metadata("design:paramtypes", [rbac_1.User, String]),
|
|
292
318
|
__metadata("design:returntype", Promise)
|
|
293
319
|
], UserMetadataController.prototype, "getMeta", null);
|
|
294
320
|
__decorate([
|
|
295
321
|
(0, http_1.Post)("metadata"),
|
|
296
322
|
(0, rbac_http_1.Permission)(['updateOwn']),
|
|
297
|
-
__param(0, (0,
|
|
323
|
+
__param(0, (0, rbac_http_1.User)()),
|
|
324
|
+
__param(1, (0, orm_http_1.AsModel)()),
|
|
298
325
|
__metadata("design:type", Function),
|
|
299
|
-
__metadata("design:paramtypes", [rbac_1.UserMetadata]),
|
|
326
|
+
__metadata("design:paramtypes", [rbac_1.User, rbac_1.UserMetadata]),
|
|
300
327
|
__metadata("design:returntype", Promise)
|
|
301
328
|
], UserMetadataController.prototype, "addMetadata", null);
|
|
302
329
|
__decorate([
|
|
303
330
|
(0, http_1.Patch)('metadata/:meta'),
|
|
304
331
|
(0, rbac_http_1.Permission)(['updateOwn']),
|
|
305
|
-
__param(0, (0,
|
|
306
|
-
__param(1, (0, http_1.
|
|
332
|
+
__param(0, (0, rbac_http_1.User)()),
|
|
333
|
+
__param(1, (0, http_1.Param)()),
|
|
334
|
+
__param(2, (0, http_1.Body)()),
|
|
307
335
|
__metadata("design:type", Function),
|
|
308
|
-
__metadata("design:paramtypes", [String, metadata_dto_js_1.UserMetadataDto]),
|
|
336
|
+
__metadata("design:paramtypes", [rbac_1.User, String, metadata_dto_js_1.UserMetadataDto]),
|
|
309
337
|
__metadata("design:returntype", Promise)
|
|
310
338
|
], UserMetadataController.prototype, "updateMetadata", null);
|
|
311
339
|
__decorate([
|
|
312
340
|
(0, http_1.Del)('metadata/:meta'),
|
|
313
341
|
(0, rbac_http_1.Permission)(['deleteOwn']),
|
|
314
|
-
__param(0, (0,
|
|
342
|
+
__param(0, (0, rbac_http_1.User)()),
|
|
343
|
+
__param(1, (0, http_1.Param)()),
|
|
315
344
|
__metadata("design:type", Function),
|
|
316
|
-
__metadata("design:paramtypes", [Number]),
|
|
345
|
+
__metadata("design:paramtypes", [rbac_1.User, Number]),
|
|
317
346
|
__metadata("design:returntype", Promise)
|
|
318
347
|
], UserMetadataController.prototype, "deleteMetadata", null);
|
|
319
348
|
exports.UserMetadataController = UserMetadataController = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wCAAgH;AAChH,wCAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { UserMetadata } from '@spinajs/rbac';
|
|
2
2
|
export declare class FilterableUserMetadata extends UserMetadata {
|
|
3
3
|
get Key(): string;
|
|
4
|
+
set Key(value: string);
|
|
4
5
|
Type: 'number' | 'float' | 'string' | 'json' | 'boolean' | 'datetime';
|
|
5
6
|
}
|
|
6
7
|
//# sourceMappingURL=FilterableUserMetadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterableUserMetadata.d.ts","sourceRoot":"","sources":["../../../src/models/FilterableUserMetadata.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,YAAY,EAAE,MAAM,eAAe,CAAC;AAG1D,qBAGa,sBAAuB,SAAQ,YAAY;IAEpD,IACW,GAAG,IAAI,MAAM,CAEvB;IAGM,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CAEhF"}
|
|
1
|
+
{"version":3,"file":"FilterableUserMetadata.d.ts","sourceRoot":"","sources":["../../../src/models/FilterableUserMetadata.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,YAAY,EAAE,MAAM,eAAe,CAAC;AAG1D,qBAGa,sBAAuB,SAAQ,YAAY;IAEpD,IACW,GAAG,IAAI,MAAM,CAEvB;IAMD,IAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAE3B;IAGM,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CAEhF"}
|
|
@@ -17,12 +17,19 @@ let FilterableUserMetadata = class FilterableUserMetadata extends rbac_1.UserMet
|
|
|
17
17
|
get Key() {
|
|
18
18
|
return super.Key;
|
|
19
19
|
}
|
|
20
|
+
// NOTE: overriding only the getter drops the setter MetadataModel defines
|
|
21
|
+
// for the same property — the accessor pair on this prototype shadows the
|
|
22
|
+
// inherited one. Hydration assigns `Key`, so every row read through this
|
|
23
|
+
// model died with "Cannot set property Key ... which has only a getter".
|
|
24
|
+
set Key(value) {
|
|
25
|
+
super.Key = value;
|
|
26
|
+
}
|
|
20
27
|
};
|
|
21
28
|
exports.FilterableUserMetadata = FilterableUserMetadata;
|
|
22
29
|
__decorate([
|
|
23
30
|
(0, orm_http_1.Filterable)(['eq', 'like', 'b-like', 'e-like']),
|
|
24
31
|
__metadata("design:type", String),
|
|
25
|
-
__metadata("design:paramtypes", [])
|
|
32
|
+
__metadata("design:paramtypes", [String])
|
|
26
33
|
], FilterableUserMetadata.prototype, "Key", null);
|
|
27
34
|
__decorate([
|
|
28
35
|
(0, orm_http_1.Filterable)(['eq']),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterableUserMetadata.js","sourceRoot":"","sources":["../../../src/models/FilterableUserMetadata.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAiD;AAGjD,wCAA0D;AAC1D,gDAA+C;AAKxC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,mBAAY;IAEpD,IACW,GAAG;QACV,OAAO,KAAK,CAAC,GAAG,CAAC;IACrB,CAAC;CAKJ,CAAA;
|
|
1
|
+
{"version":3,"file":"FilterableUserMetadata.js","sourceRoot":"","sources":["../../../src/models/FilterableUserMetadata.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAiD;AAGjD,wCAA0D;AAC1D,gDAA+C;AAKxC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,mBAAY;IAEpD,IACW,GAAG;QACV,OAAO,KAAK,CAAC,GAAG,CAAC;IACrB,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,IAAW,GAAG,CAAC,KAAa;QACxB,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;IACtB,CAAC;CAKJ,CAAA;AAlBY,wDAAsB;AAE/B;IAAC,IAAA,qBAAU,EAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAC,QAAQ,CAAC,CAAC;;;iDAG7C;AAWM;IADN,IAAA,qBAAU,EAAC,CAAC,IAAI,CAAC,CAAC;;oDAC0D;iCAhBpE,sBAAsB;IAHlC,IAAA,gBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,WAAK,EAAC,gBAAgB,CAAC;IACvB,IAAA,kBAAW,EAAC,eAAe,CAAC;GAChB,sBAAsB,CAkBlC"}
|
package/lib/mjs/actions/2fa.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { User } from '@spinajs/rbac';
|
|
2
|
+
/**
|
|
3
|
+
* NOTE for all three actions below: the event must be emitted for the USER, not
|
|
4
|
+
* for whatever the provider call returned ( `initialize()` returns the otpauth
|
|
5
|
+
* url ). `_user_ev` reads `Uuid` off its argument, so it is bound to `u`
|
|
6
|
+
* explicitly and the provider result is passed through untouched.
|
|
7
|
+
*/
|
|
2
8
|
export declare function enableUser2Fa(identifier: number | string | User): Promise<unknown>;
|
|
3
9
|
export declare function disableUser2Fa(identifier: number | string | User): Promise<unknown>;
|
|
4
10
|
export declare function resetUser2Fa(identifier: number | string | User): Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa.d.ts","sourceRoot":"","sources":["../../../src/actions/2fa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAyD,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"2fa.d.ts","sourceRoot":"","sources":["../../../src/actions/2fa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAyD,MAAM,eAAe,CAAC;AAa5F;;;;;GAKG;AAEH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,oBAYrE;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,oBAWtE;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,oBAiBpE;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,oBA8B9E"}
|
package/lib/mjs/actions/2fa.js
CHANGED
|
@@ -7,20 +7,34 @@ import { User2FaPassed } from '../events/User2FaPassed.js';
|
|
|
7
7
|
import { User2FaEnabled } from '../events/User2FaEnabled.js';
|
|
8
8
|
import { TwoFactorAuthProvider, } from '@spinajs/rbac-http';
|
|
9
9
|
import { User2FaReset } from '../events/User2FaReset.js';
|
|
10
|
+
import { User2FaDisabled } from '../events/User2FaDisabled.js';
|
|
11
|
+
/**
|
|
12
|
+
* NOTE for all three actions below: the event must be emitted for the USER, not
|
|
13
|
+
* for whatever the provider call returned ( `initialize()` returns the otpauth
|
|
14
|
+
* url ). `_user_ev` reads `Uuid` off its argument, so it is bound to `u`
|
|
15
|
+
* explicitly and the provider result is passed through untouched.
|
|
16
|
+
*/
|
|
10
17
|
export async function enableUser2Fa(identifier) {
|
|
11
18
|
return _chain(_user_unsafe(identifier), (u) => {
|
|
12
|
-
return _chain(_service('rbac.twoFactorAuth', TwoFactorAuthProvider), async (twoFa) => twoFa.initialize(u),
|
|
19
|
+
return _chain(_service('rbac.twoFactorAuth', TwoFactorAuthProvider), async (twoFa) => twoFa.initialize(u),
|
|
20
|
+
// keeps the otpauth url as the result of the action
|
|
21
|
+
_tap(async () => _user_ev(User2FaEnabled)(u)));
|
|
13
22
|
});
|
|
14
23
|
}
|
|
15
24
|
export async function disableUser2Fa(identifier) {
|
|
16
25
|
return _chain(_user_unsafe(identifier), (u) => {
|
|
17
|
-
return _chain(_service('rbac.twoFactorAuth', TwoFactorAuthProvider), async (twoFa) => twoFa.disable(u),
|
|
26
|
+
return _chain(_service('rbac.twoFactorAuth', TwoFactorAuthProvider), async (twoFa) => twoFa.disable(u), () => _user_ev(User2FaDisabled)(u));
|
|
18
27
|
});
|
|
19
28
|
}
|
|
20
29
|
export async function resetUser2Fa(identifier) {
|
|
21
30
|
return _chain(_user_unsafe(identifier), (u) => {
|
|
22
|
-
|
|
23
|
-
|
|
31
|
+
// NOTE: this used to read
|
|
32
|
+
// return _chain( ... ), _tap(_user_ev(User2FaReset));
|
|
33
|
+
// The comma operator threw the disabling chain away un-awaited and
|
|
34
|
+
// returned the _tap function itself, so `await resetUser2Fa(user)`
|
|
35
|
+
// resolved before ( or without ) the secrets being cleared and the
|
|
36
|
+
// User2FaReset event was never emitted.
|
|
37
|
+
return _chain(_service('rbac.twoFactorAuth', TwoFactorAuthProvider), async (twoFa) => twoFa.disable(u), () => _user_ev(User2FaReset)(u));
|
|
24
38
|
});
|
|
25
39
|
}
|
|
26
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2fa.js","sourceRoot":"","sources":["../../../src/actions/2fa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAmB,KAAK,EAAQ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,GAAG,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"2fa.js","sourceRoot":"","sources":["../../../src/actions/2fa.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export declare class ActiveRoleController extends BaseController {
|
|
|
16
16
|
protected PasswordProvider: PasswordProvider;
|
|
17
17
|
protected SessionProvider: SessionProvider;
|
|
18
18
|
protected RolesRequiringPassword: string[];
|
|
19
|
+
protected SessionCookieConfig: any;
|
|
19
20
|
/**
|
|
20
21
|
* Get active role
|
|
21
22
|
* Returns the currently active role for the session and the RBAC grants
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveRoleController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ActiveRoleController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAwB,EAAE,EAAO,kBAAkB,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"ActiveRoleController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ActiveRoleController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAwB,EAAE,EAAO,kBAAkB,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAyD,MAAM,eAAe,CAAC;AACtJ,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAA+E,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEtI;;;;;;GAMG;AACH,qBACa,oBAAqB,SAAQ,cAAc;IAEtD,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;IAG5B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IAGrC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAG7C,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAG3C,SAAS,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IAG3C,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAEnC;;;;;;;OAOG;IAGU,aAAa,CAAiB,IAAI,EAAE,IAAI,EAAiB,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAI3H;;;;;;;;;OASG;IAGU,gBAAgB,CACX,IAAI,EAAE,IAAI,EACP,OAAO,EAAE,QAAQ,EAC5B,OAAO,EAAE,aAAa,GAC7B,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,kBAAkB,GAAG,YAAY,CAAC;IAqDvE,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB;CAOjE"}
|
|
@@ -12,7 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
};
|
|
13
13
|
import { SwitchRoleDto } from '../dto/switchRole-dto.js';
|
|
14
14
|
import { BaseController, BasePath, Post, Body, Ok, Get, BadRequestResponse, Unauthorized, Policy } from '@spinajs/http';
|
|
15
|
-
import { AccessControl, AuthProvider, PasswordProvider, SessionProvider, _unwindGrants } from '@spinajs/rbac';
|
|
15
|
+
import { AccessControl, AuthProvider, PasswordProvider, SessionProvider, _unwindGrants, regenerateSession, sessionCookieMaxAge } from '@spinajs/rbac';
|
|
16
16
|
import { Autoinject } from '@spinajs/di';
|
|
17
17
|
import { AutoinjectService, Config } from '@spinajs/configuration';
|
|
18
18
|
import { LoggedPolicy, User as UserRouteArg, Session as SessionRouteArg, FromSession } from '@spinajs/rbac-http';
|
|
@@ -74,8 +74,23 @@ let ActiveRoleController = class ActiveRoleController extends BaseController {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
session.Data.set('ActiveRole', payload.Role);
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
// Privilege elevation — regenerate the session id to defend against session
|
|
78
|
+
// fixation, and reset the ssid cookie to the new id.
|
|
79
|
+
const regenerated = await regenerateSession(this.SessionProvider, session);
|
|
80
|
+
return new Ok(this.buildResponse(payload.Role), {
|
|
81
|
+
Coockies: [
|
|
82
|
+
{
|
|
83
|
+
Name: 'ssid',
|
|
84
|
+
Value: regenerated.SessionId,
|
|
85
|
+
Options: {
|
|
86
|
+
signed: true,
|
|
87
|
+
httpOnly: true,
|
|
88
|
+
maxAge: sessionCookieMaxAge(regenerated),
|
|
89
|
+
...this.SessionCookieConfig,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
});
|
|
79
94
|
}
|
|
80
95
|
buildResponse(activeRole) {
|
|
81
96
|
const grants = activeRole ? _unwindGrants(activeRole, this.AC.getGrants()) : {};
|
|
@@ -105,6 +120,10 @@ __decorate([
|
|
|
105
120
|
Config('rbac.roleSwitch.requirePassword', { defaultValue: [] }),
|
|
106
121
|
__metadata("design:type", Array)
|
|
107
122
|
], ActiveRoleController.prototype, "RolesRequiringPassword", void 0);
|
|
123
|
+
__decorate([
|
|
124
|
+
Config('rbac.session.cookie', {}),
|
|
125
|
+
__metadata("design:type", Object)
|
|
126
|
+
], ActiveRoleController.prototype, "SessionCookieConfig", void 0);
|
|
108
127
|
__decorate([
|
|
109
128
|
Get('active-role'),
|
|
110
129
|
Policy(LoggedPolicy),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveRoleController.js","sourceRoot":"","sources":["../../../src/controllers/ActiveRoleController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ActiveRoleController.js","sourceRoot":"","sources":["../../../src/controllers/ActiveRoleController.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,6 @@ export declare class LoginController extends BaseController {
|
|
|
15
15
|
protected Configuration: Configuration;
|
|
16
16
|
protected AuthProvider: AuthProvider;
|
|
17
17
|
protected SessionProvider: SessionProvider;
|
|
18
|
-
protected SessionExpirationTime: number;
|
|
19
18
|
protected TwoFactorAuthEnabled: boolean;
|
|
20
19
|
protected TwoFactorAuthForceUser: boolean;
|
|
21
20
|
protected SessionCookieConfig: any;
|
|
@@ -66,6 +65,7 @@ export declare class LoginController extends BaseController {
|
|
|
66
65
|
IsGuest: boolean;
|
|
67
66
|
IsBanned: boolean;
|
|
68
67
|
IsDirty: boolean;
|
|
68
|
+
Snapshot: import("@spinajs/orm").IModelSnapshot | null;
|
|
69
69
|
Metadata: Omit<import("@spinajs/orm").ModelDataWithRelationData<import("@spinajs/rbac").UserMetadataBase>, import("@spinajs/orm").ExcludedModelProperties>[];
|
|
70
70
|
PrimaryKeyValue: any;
|
|
71
71
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginController.d.ts","sourceRoot":"","sources":["../../../src/controllers/LoginController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAwB,EAAE,EAAe,YAAY,EAAU,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAsB,aAAa,
|
|
1
|
+
{"version":3,"file":"LoginController.d.ts","sourceRoot":"","sources":["../../../src/controllers/LoginController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAwB,EAAE,EAAe,YAAY,EAAU,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAsB,aAAa,EAA+D,MAAM,eAAe,CAAC;AAG9J,OAAO,EAA6B,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAA+E,cAAc,EAAwC,MAAM,oBAAoB,CAAC;AACvK,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C;;;;;GAKG;AACH,qBACa,eAAgB,SAAQ,cAAc;IAEjD,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IAGvC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IAGrC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAK3C,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC;IAMxC,SAAS,CAAC,sBAAsB,EAAE,OAAO,CAAC;IAG1C,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAGnC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;IAE5B;;;;;;;;;OASG;IAGU,KAAK,CAAiB,MAAM,EAAE,IAAI,EAAgB,IAAI,EAAE,MAAM,EAAU,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;IA8H3J;;;;;;;;OAQG;IAGU,MAAM,CAAe,IAAI,EAAE,MAAM,EAAqB,OAAO,EAAE,QAAQ,EAAkB,IAAI,EAAE,IAAI;IA6BhH;;;;;;;;OAQG;IAGU,MAAM,CAAiB,IAAI,EAAE,IAAI,EAAiB,UAAU,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;CAOlF"}
|
|
@@ -12,7 +12,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
};
|
|
13
13
|
import { UserLoginDto } from '../dto/userLogin-dto.js';
|
|
14
14
|
import { BaseController, BasePath, Post, Body, Ok, Get, Cookie, Unauthorized, Policy } from '@spinajs/http';
|
|
15
|
-
import { AuthProvider, SessionProvider, login, UserSession, AccessControl, _unwindGrants } from '@spinajs/rbac';
|
|
15
|
+
import { AuthProvider, SessionProvider, login, UserSession, AccessControl, _unwindGrants, sessionCookieMaxAge, AthenticationErrorCodes } from '@spinajs/rbac';
|
|
16
|
+
import { ErrorCode, InvalidArgument } from '@spinajs/exceptions';
|
|
16
17
|
import { Autoinject, DI } from '@spinajs/di';
|
|
17
18
|
import { AutoinjectService, Config, Configuration } from '@spinajs/configuration';
|
|
18
19
|
import { LoggedPolicy, User as UserRouteArg, Session as SessionRouteArg, FromSession, SkipModelPermission } from '@spinajs/rbac-http';
|
|
@@ -44,21 +45,6 @@ let LoginController = class LoginController extends BaseController {
|
|
|
44
45
|
}
|
|
45
46
|
const user = await login(credentials.Email, credentials.Password);
|
|
46
47
|
const session = new UserSession();
|
|
47
|
-
const coockies = [
|
|
48
|
-
{
|
|
49
|
-
Name: 'ssid',
|
|
50
|
-
Value: session.SessionId,
|
|
51
|
-
Options: {
|
|
52
|
-
signed: true,
|
|
53
|
-
httpOnly: true,
|
|
54
|
-
// set expiration time in ms
|
|
55
|
-
maxAge: this.SessionExpirationTime * 1000,
|
|
56
|
-
// any optopnal cookie options
|
|
57
|
-
// or override default ones
|
|
58
|
-
...this.SessionCookieConfig
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
];
|
|
62
48
|
let result;
|
|
63
49
|
session.Data.set('User', user.Uuid);
|
|
64
50
|
// Default active role = first role from the user's role list.
|
|
@@ -73,8 +59,6 @@ let LoginController = class LoginController extends BaseController {
|
|
|
73
59
|
// user is automatically authorized at login
|
|
74
60
|
session.Data.set('Logged', true);
|
|
75
61
|
session.UserId = user.Id;
|
|
76
|
-
// set expiration time ( default val in config )
|
|
77
|
-
session.extend();
|
|
78
62
|
if (this.TwoFactorAuthForceUser && !user.Metadata['2fa:enabled']) {
|
|
79
63
|
this._log.trace('User logged in, 2fa init required', {
|
|
80
64
|
Uuid: user.Uuid
|
|
@@ -107,13 +91,43 @@ let LoginController = class LoginController extends BaseController {
|
|
|
107
91
|
this._log.trace('User logged in, no 2fa required', {
|
|
108
92
|
Uuid: user.Uuid
|
|
109
93
|
});
|
|
94
|
+
// save() schedules the session's initial expiration via the configured
|
|
95
|
+
// strategy; the cookie maxAge is then derived from that real expiry (B1),
|
|
96
|
+
// no longer the bogus `expiration * 1000` (~2 min) value.
|
|
110
97
|
await this.SessionProvider.save(session);
|
|
98
|
+
const coockies = [
|
|
99
|
+
{
|
|
100
|
+
Name: 'ssid',
|
|
101
|
+
Value: session.SessionId,
|
|
102
|
+
Options: {
|
|
103
|
+
signed: true,
|
|
104
|
+
httpOnly: true,
|
|
105
|
+
// cookie lifetime tracks the session's real expiration
|
|
106
|
+
maxAge: sessionCookieMaxAge(session),
|
|
107
|
+
// any optional cookie options / override default ones
|
|
108
|
+
...this.SessionCookieConfig
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
];
|
|
111
112
|
return new Ok(result, {
|
|
112
113
|
Coockies: coockies
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
116
|
catch (err) {
|
|
116
|
-
|
|
117
|
+
// Only real authentication failures map to 401. ErrorCode comes from the
|
|
118
|
+
// AuthProvider ( bad credentials / banned / inactive ), InvalidArgument
|
|
119
|
+
// from the `_check_arg` guards ( empty or malformed email / password ).
|
|
120
|
+
// Anything else — db down, session store failure, misconfiguration — was
|
|
121
|
+
// previously masked as "login or password incorrect", hiding real
|
|
122
|
+
// outages behind a 401. Those are rethrown so the http error handler
|
|
123
|
+
// maps them to a 500 and logs the full stack.
|
|
124
|
+
const isAuthFailure = err instanceof ErrorCode || err instanceof InvalidArgument;
|
|
125
|
+
if (!isAuthFailure) {
|
|
126
|
+
this._log.error(err, `Login failed unexpectedly for ${credentials?.Email}`);
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
const reason = err instanceof ErrorCode ? AthenticationErrorCodes[err.code] ?? err.code : 'E_INVALID_ARGUMENT';
|
|
130
|
+
this._log.warn(err, `Login failed for ${credentials?.Email}: ${reason}`);
|
|
117
131
|
return new Unauthorized({
|
|
118
132
|
error: {
|
|
119
133
|
code: 'E_AUTH_FAILED',
|
|
@@ -184,12 +198,6 @@ __decorate([
|
|
|
184
198
|
AutoinjectService('rbac.session'),
|
|
185
199
|
__metadata("design:type", SessionProvider)
|
|
186
200
|
], LoginController.prototype, "SessionProvider", void 0);
|
|
187
|
-
__decorate([
|
|
188
|
-
Config('rbac.session.expiration', {
|
|
189
|
-
defaultValue: 120,
|
|
190
|
-
}),
|
|
191
|
-
__metadata("design:type", Number)
|
|
192
|
-
], LoginController.prototype, "SessionExpirationTime", void 0);
|
|
193
201
|
__decorate([
|
|
194
202
|
Config('rbac.twoFactorAuth.enabled', {
|
|
195
203
|
defaultValue: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../../src/controllers/LoginController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../../src/controllers/LoginController.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { IEnable2faResponse, IUserWithGrants } from "@spinajs/rbac-http";
|
|
|
14
14
|
export declare class TwoFactorAuthController extends BaseController {
|
|
15
15
|
protected Queue: QueueService;
|
|
16
16
|
protected SessionProvider: SessionProvider;
|
|
17
|
+
protected SessionCookieConfig: any;
|
|
17
18
|
protected AC: AccessControl;
|
|
18
19
|
/**
|
|
19
20
|
* Enable two-factor authentication
|
|
@@ -45,5 +46,11 @@ export declare class TwoFactorAuthController extends BaseController {
|
|
|
45
46
|
* @response 401 Unauthorized — valid session required
|
|
46
47
|
*/
|
|
47
48
|
verifyToken(logged: UserModel, token: TokenDto, session: ISession): Promise<Ok<IUserWithGrants> | ForbiddenResponse>;
|
|
49
|
+
/**
|
|
50
|
+
* Verifies the supplied TOTP token against the user's 2FA secret. Wraps the
|
|
51
|
+
* module-level `auth2Fa` action in a protected method so tests can stub the
|
|
52
|
+
* verification without a TOTP/DB setup.
|
|
53
|
+
*/
|
|
54
|
+
protected verifyTwoFactorToken(user: UserModel, token: string): Promise<void>;
|
|
48
55
|
}
|
|
49
56
|
//# sourceMappingURL=TwoFactorAuthController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TwoFactorAuthController.d.ts","sourceRoot":"","sources":["../../../src/controllers/TwoFactorAuthController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAY,EAAE,EAAa,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,IAAI,SAAS,EAAyC,aAAa,
|
|
1
|
+
{"version":3,"file":"TwoFactorAuthController.d.ts","sourceRoot":"","sources":["../../../src/controllers/TwoFactorAuthController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAY,EAAE,EAAa,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,IAAI,SAAS,EAAyC,aAAa,EAA0C,MAAM,eAAe,CAAC;AAO3K,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAA6B,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKpG;;;;;;;GAOG;AACH,qBAGa,uBAAwB,SAAQ,cAAc;IAEvD,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC;IAG9B,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAG3C,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAGnC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;IAE5B;;;;;;;;OAQG;IAEU,SAAS,CAAS,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAYhF;;;;;;;;OAQG;IAEU,UAAU,CAAS,IAAI,EAAE,SAAS;IAS/C;;;;;;;;OAQG;IAEU,WAAW,CAAS,MAAM,EAAE,SAAS,EAAU,KAAK,EAAE,QAAQ,EAAa,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,iBAAiB,CAAC;IAgE5J;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhF"}
|