@getstrata/bootstrap 0.2.60 → 0.2.62
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/CHANGELOG.md +8 -0
- package/dist/bootstrap/httpKernel.d.ts +9 -0
- package/dist/entries/buildModuleRoutes.js +47 -4
- package/dist/entries/buildWebModuleRoutes.js +47 -4
- package/dist/entries/createRoutes.js +47 -4
- package/dist/entries/createWebRoutes.js +47 -4
- package/dist/entries/httpKernel.js +47 -4
- package/dist/entries/web/routing.js +47 -4
- package/dist/index.js +47 -4
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @getstrata/bootstrap changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.62
|
|
4
|
+
|
|
5
|
+
- `HttpKernel.wrapWebPasswordConfirm()` is Laravel `password.confirm` for HTML routes. Peer `@getstrata/core` `^0.5.75`.
|
|
6
|
+
|
|
7
|
+
## 0.2.61
|
|
8
|
+
|
|
9
|
+
- `HttpKernel.wrapVerified()` / `wrapWebVerified()` / `wrapWebAuthenticatedAllowUnverified()`. When `FEATURE_EMAIL_VERIFICATION=true`, `wrapWebAuthenticated` and `wrapWebAbility` require a verified email. Peer `@getstrata/core` `^0.5.74`.
|
|
10
|
+
|
|
3
11
|
## 0.2.60
|
|
4
12
|
|
|
5
13
|
- Peer `@getstrata/core` `^0.5.73` for public OpenAPI email verification resend.
|
|
@@ -14,9 +14,16 @@ declare class HttpKernel {
|
|
|
14
14
|
wrapWebGuest(handler: RouteHandler, home?: string): RouteHandler;
|
|
15
15
|
wrapWebPublicRead(handler: RouteHandler): RouteHandler;
|
|
16
16
|
wrapWebAuthenticated(handler: RouteHandler): RouteHandler;
|
|
17
|
+
/** Signed-in HTML without Laravel `verified` (logout, verification notice). */
|
|
18
|
+
wrapWebAuthenticatedAllowUnverified(handler: RouteHandler): RouteHandler;
|
|
19
|
+
wrapWebVerified(handler: RouteHandler): RouteHandler;
|
|
20
|
+
/** Laravel `password.confirm` — requires a fresh signed confirmation cookie. */
|
|
21
|
+
wrapWebPasswordConfirm(handler: RouteHandler): RouteHandler;
|
|
17
22
|
wrapWebAbility(ability: string, handler: RouteHandler): RouteHandler;
|
|
18
23
|
wrapWebGlobalAdmin(handler: RouteHandler): RouteHandler;
|
|
19
24
|
wrapAuthenticated(handler: RouteHandler): RouteHandler;
|
|
25
|
+
/** Laravel `verified` for JSON/API routes. No-op when `FEATURE_EMAIL_VERIFICATION` is off. */
|
|
26
|
+
wrapVerified(handler: RouteHandler): RouteHandler;
|
|
20
27
|
wrapPublicRead(handler: RouteHandler): RouteHandler;
|
|
21
28
|
wrapGlobalAdmin(handler: RouteHandler): RouteHandler;
|
|
22
29
|
wrapAbility(ability: string, handler: RouteHandler): RouteHandler;
|
|
@@ -24,6 +31,8 @@ declare class HttpKernel {
|
|
|
24
31
|
wrapLogin(handler: RouteHandler): RouteHandler;
|
|
25
32
|
wrapSigned(handler: RouteHandler): RouteHandler;
|
|
26
33
|
wrapRegister(handler: RouteHandler): RouteHandler;
|
|
34
|
+
private wrapWebAuth;
|
|
35
|
+
private verifiedMiddleware;
|
|
27
36
|
private wrapThrottle;
|
|
28
37
|
}
|
|
29
38
|
declare function createHttpKernel(dependencies: AppDependencies): HttpKernel;
|
|
@@ -6,6 +6,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
|
|
|
6
6
|
import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
|
|
7
7
|
|
|
8
8
|
// ../../src/bootstrap/httpKernel.ts
|
|
9
|
+
import {
|
|
10
|
+
hasVerifiedEmail,
|
|
11
|
+
isEmailVerificationRequired
|
|
12
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
9
13
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
10
14
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
11
15
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -21,6 +25,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
21
25
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
22
26
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
23
27
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
28
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
29
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
24
30
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
25
31
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
26
32
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -180,6 +186,9 @@ class HttpKernel {
|
|
|
180
186
|
return this.wrapWeb(async (request) => {
|
|
181
187
|
const user = await auth.resolve(request);
|
|
182
188
|
if (user) {
|
|
189
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
190
|
+
return Response.redirect("/email/verify", 302);
|
|
191
|
+
}
|
|
183
192
|
return Response.redirect(home, 302);
|
|
184
193
|
}
|
|
185
194
|
return handler(request);
|
|
@@ -192,24 +201,46 @@ class HttpKernel {
|
|
|
192
201
|
return this.wrapWebAuthenticated(handler);
|
|
193
202
|
}
|
|
194
203
|
wrapWebAuthenticated(handler) {
|
|
195
|
-
|
|
196
|
-
|
|
204
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
205
|
+
}
|
|
206
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
207
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
208
|
+
}
|
|
209
|
+
wrapWebVerified(handler) {
|
|
210
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
211
|
+
}
|
|
212
|
+
wrapWebPasswordConfirm(handler) {
|
|
213
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
214
|
+
verified: true
|
|
215
|
+
});
|
|
197
216
|
}
|
|
198
217
|
wrapWebAbility(ability, handler) {
|
|
199
218
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
200
219
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
201
220
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
202
|
-
const middleware = [
|
|
221
|
+
const middleware = [
|
|
222
|
+
createRequireWebAuthMiddleware(auth),
|
|
223
|
+
...this.verifiedMiddleware(),
|
|
224
|
+
requireAbility(ability)
|
|
225
|
+
];
|
|
203
226
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
204
227
|
}
|
|
205
228
|
wrapWebGlobalAdmin(handler) {
|
|
206
229
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
207
|
-
const middleware = [
|
|
230
|
+
const middleware = [
|
|
231
|
+
createRequireWebAuthMiddleware(auth),
|
|
232
|
+
...this.verifiedMiddleware(),
|
|
233
|
+
createRequireGlobalAdminMiddleware()
|
|
234
|
+
];
|
|
208
235
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
209
236
|
}
|
|
210
237
|
wrapAuthenticated(handler) {
|
|
211
238
|
return this.wrap("authenticated", handler);
|
|
212
239
|
}
|
|
240
|
+
wrapVerified(handler) {
|
|
241
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
242
|
+
return withMiddleware(...middleware)(handler);
|
|
243
|
+
}
|
|
213
244
|
wrapPublicRead(handler) {
|
|
214
245
|
if (isPublicReadsEnabled()) {
|
|
215
246
|
return handler;
|
|
@@ -240,6 +271,18 @@ class HttpKernel {
|
|
|
240
271
|
wrapRegister(handler) {
|
|
241
272
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
242
273
|
}
|
|
274
|
+
wrapWebAuth(handler, options) {
|
|
275
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
276
|
+
const middleware = [
|
|
277
|
+
createRequireWebAuthMiddleware(auth),
|
|
278
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
279
|
+
];
|
|
280
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
281
|
+
}
|
|
282
|
+
verifiedMiddleware() {
|
|
283
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
284
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
285
|
+
}
|
|
243
286
|
wrapThrottle(scope, rateLimit, handler) {
|
|
244
287
|
const middleware = [];
|
|
245
288
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
|
@@ -9,6 +9,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
|
|
|
9
9
|
import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
|
|
10
10
|
|
|
11
11
|
// ../../src/bootstrap/httpKernel.ts
|
|
12
|
+
import {
|
|
13
|
+
hasVerifiedEmail,
|
|
14
|
+
isEmailVerificationRequired
|
|
15
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
12
16
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
13
17
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
14
18
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -24,6 +28,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
24
28
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
25
29
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
26
30
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
31
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
32
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
27
33
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
28
34
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
29
35
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -183,6 +189,9 @@ class HttpKernel {
|
|
|
183
189
|
return this.wrapWeb(async (request) => {
|
|
184
190
|
const user = await auth.resolve(request);
|
|
185
191
|
if (user) {
|
|
192
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
193
|
+
return Response.redirect("/email/verify", 302);
|
|
194
|
+
}
|
|
186
195
|
return Response.redirect(home, 302);
|
|
187
196
|
}
|
|
188
197
|
return handler(request);
|
|
@@ -195,24 +204,46 @@ class HttpKernel {
|
|
|
195
204
|
return this.wrapWebAuthenticated(handler);
|
|
196
205
|
}
|
|
197
206
|
wrapWebAuthenticated(handler) {
|
|
198
|
-
|
|
199
|
-
|
|
207
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
208
|
+
}
|
|
209
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
210
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
211
|
+
}
|
|
212
|
+
wrapWebVerified(handler) {
|
|
213
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
214
|
+
}
|
|
215
|
+
wrapWebPasswordConfirm(handler) {
|
|
216
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
217
|
+
verified: true
|
|
218
|
+
});
|
|
200
219
|
}
|
|
201
220
|
wrapWebAbility(ability, handler) {
|
|
202
221
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
203
222
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
204
223
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
205
|
-
const middleware = [
|
|
224
|
+
const middleware = [
|
|
225
|
+
createRequireWebAuthMiddleware(auth),
|
|
226
|
+
...this.verifiedMiddleware(),
|
|
227
|
+
requireAbility(ability)
|
|
228
|
+
];
|
|
206
229
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
207
230
|
}
|
|
208
231
|
wrapWebGlobalAdmin(handler) {
|
|
209
232
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
210
|
-
const middleware = [
|
|
233
|
+
const middleware = [
|
|
234
|
+
createRequireWebAuthMiddleware(auth),
|
|
235
|
+
...this.verifiedMiddleware(),
|
|
236
|
+
createRequireGlobalAdminMiddleware()
|
|
237
|
+
];
|
|
211
238
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
212
239
|
}
|
|
213
240
|
wrapAuthenticated(handler) {
|
|
214
241
|
return this.wrap("authenticated", handler);
|
|
215
242
|
}
|
|
243
|
+
wrapVerified(handler) {
|
|
244
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
245
|
+
return withMiddleware(...middleware)(handler);
|
|
246
|
+
}
|
|
216
247
|
wrapPublicRead(handler) {
|
|
217
248
|
if (isPublicReadsEnabled()) {
|
|
218
249
|
return handler;
|
|
@@ -243,6 +274,18 @@ class HttpKernel {
|
|
|
243
274
|
wrapRegister(handler) {
|
|
244
275
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
245
276
|
}
|
|
277
|
+
wrapWebAuth(handler, options) {
|
|
278
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
279
|
+
const middleware = [
|
|
280
|
+
createRequireWebAuthMiddleware(auth),
|
|
281
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
282
|
+
];
|
|
283
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
284
|
+
}
|
|
285
|
+
verifiedMiddleware() {
|
|
286
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
287
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
288
|
+
}
|
|
246
289
|
wrapThrottle(scope, rateLimit, handler) {
|
|
247
290
|
const middleware = [];
|
|
248
291
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
|
@@ -46,6 +46,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
|
|
|
46
46
|
import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
|
|
47
47
|
|
|
48
48
|
// ../../src/bootstrap/httpKernel.ts
|
|
49
|
+
import {
|
|
50
|
+
hasVerifiedEmail,
|
|
51
|
+
isEmailVerificationRequired
|
|
52
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
49
53
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
50
54
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
51
55
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -61,6 +65,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
61
65
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
62
66
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
63
67
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
68
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
69
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
64
70
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
65
71
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
66
72
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -220,6 +226,9 @@ class HttpKernel {
|
|
|
220
226
|
return this.wrapWeb(async (request) => {
|
|
221
227
|
const user = await auth.resolve(request);
|
|
222
228
|
if (user) {
|
|
229
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
230
|
+
return Response.redirect("/email/verify", 302);
|
|
231
|
+
}
|
|
223
232
|
return Response.redirect(home, 302);
|
|
224
233
|
}
|
|
225
234
|
return handler(request);
|
|
@@ -232,24 +241,46 @@ class HttpKernel {
|
|
|
232
241
|
return this.wrapWebAuthenticated(handler);
|
|
233
242
|
}
|
|
234
243
|
wrapWebAuthenticated(handler) {
|
|
235
|
-
|
|
236
|
-
|
|
244
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
245
|
+
}
|
|
246
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
247
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
248
|
+
}
|
|
249
|
+
wrapWebVerified(handler) {
|
|
250
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
251
|
+
}
|
|
252
|
+
wrapWebPasswordConfirm(handler) {
|
|
253
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
254
|
+
verified: true
|
|
255
|
+
});
|
|
237
256
|
}
|
|
238
257
|
wrapWebAbility(ability, handler) {
|
|
239
258
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
240
259
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
241
260
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
242
|
-
const middleware = [
|
|
261
|
+
const middleware = [
|
|
262
|
+
createRequireWebAuthMiddleware(auth),
|
|
263
|
+
...this.verifiedMiddleware(),
|
|
264
|
+
requireAbility(ability)
|
|
265
|
+
];
|
|
243
266
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
244
267
|
}
|
|
245
268
|
wrapWebGlobalAdmin(handler) {
|
|
246
269
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
247
|
-
const middleware = [
|
|
270
|
+
const middleware = [
|
|
271
|
+
createRequireWebAuthMiddleware(auth),
|
|
272
|
+
...this.verifiedMiddleware(),
|
|
273
|
+
createRequireGlobalAdminMiddleware()
|
|
274
|
+
];
|
|
248
275
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
249
276
|
}
|
|
250
277
|
wrapAuthenticated(handler) {
|
|
251
278
|
return this.wrap("authenticated", handler);
|
|
252
279
|
}
|
|
280
|
+
wrapVerified(handler) {
|
|
281
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
282
|
+
return withMiddleware(...middleware)(handler);
|
|
283
|
+
}
|
|
253
284
|
wrapPublicRead(handler) {
|
|
254
285
|
if (isPublicReadsEnabled()) {
|
|
255
286
|
return handler;
|
|
@@ -280,6 +311,18 @@ class HttpKernel {
|
|
|
280
311
|
wrapRegister(handler) {
|
|
281
312
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
282
313
|
}
|
|
314
|
+
wrapWebAuth(handler, options) {
|
|
315
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
316
|
+
const middleware = [
|
|
317
|
+
createRequireWebAuthMiddleware(auth),
|
|
318
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
319
|
+
];
|
|
320
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
321
|
+
}
|
|
322
|
+
verifiedMiddleware() {
|
|
323
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
324
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
325
|
+
}
|
|
283
326
|
wrapThrottle(scope, rateLimit, handler) {
|
|
284
327
|
const middleware = [];
|
|
285
328
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
|
@@ -14,6 +14,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
|
|
|
14
14
|
import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
|
|
15
15
|
|
|
16
16
|
// ../../src/bootstrap/httpKernel.ts
|
|
17
|
+
import {
|
|
18
|
+
hasVerifiedEmail,
|
|
19
|
+
isEmailVerificationRequired
|
|
20
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
17
21
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
18
22
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
19
23
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -29,6 +33,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
29
33
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
30
34
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
31
35
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
36
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
37
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
32
38
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
33
39
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
34
40
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -188,6 +194,9 @@ class HttpKernel {
|
|
|
188
194
|
return this.wrapWeb(async (request) => {
|
|
189
195
|
const user = await auth.resolve(request);
|
|
190
196
|
if (user) {
|
|
197
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
198
|
+
return Response.redirect("/email/verify", 302);
|
|
199
|
+
}
|
|
191
200
|
return Response.redirect(home, 302);
|
|
192
201
|
}
|
|
193
202
|
return handler(request);
|
|
@@ -200,24 +209,46 @@ class HttpKernel {
|
|
|
200
209
|
return this.wrapWebAuthenticated(handler);
|
|
201
210
|
}
|
|
202
211
|
wrapWebAuthenticated(handler) {
|
|
203
|
-
|
|
204
|
-
|
|
212
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
213
|
+
}
|
|
214
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
215
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
216
|
+
}
|
|
217
|
+
wrapWebVerified(handler) {
|
|
218
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
219
|
+
}
|
|
220
|
+
wrapWebPasswordConfirm(handler) {
|
|
221
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
222
|
+
verified: true
|
|
223
|
+
});
|
|
205
224
|
}
|
|
206
225
|
wrapWebAbility(ability, handler) {
|
|
207
226
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
208
227
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
209
228
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
210
|
-
const middleware = [
|
|
229
|
+
const middleware = [
|
|
230
|
+
createRequireWebAuthMiddleware(auth),
|
|
231
|
+
...this.verifiedMiddleware(),
|
|
232
|
+
requireAbility(ability)
|
|
233
|
+
];
|
|
211
234
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
212
235
|
}
|
|
213
236
|
wrapWebGlobalAdmin(handler) {
|
|
214
237
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
215
|
-
const middleware = [
|
|
238
|
+
const middleware = [
|
|
239
|
+
createRequireWebAuthMiddleware(auth),
|
|
240
|
+
...this.verifiedMiddleware(),
|
|
241
|
+
createRequireGlobalAdminMiddleware()
|
|
242
|
+
];
|
|
216
243
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
217
244
|
}
|
|
218
245
|
wrapAuthenticated(handler) {
|
|
219
246
|
return this.wrap("authenticated", handler);
|
|
220
247
|
}
|
|
248
|
+
wrapVerified(handler) {
|
|
249
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
250
|
+
return withMiddleware(...middleware)(handler);
|
|
251
|
+
}
|
|
221
252
|
wrapPublicRead(handler) {
|
|
222
253
|
if (isPublicReadsEnabled()) {
|
|
223
254
|
return handler;
|
|
@@ -248,6 +279,18 @@ class HttpKernel {
|
|
|
248
279
|
wrapRegister(handler) {
|
|
249
280
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
250
281
|
}
|
|
282
|
+
wrapWebAuth(handler, options) {
|
|
283
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
284
|
+
const middleware = [
|
|
285
|
+
createRequireWebAuthMiddleware(auth),
|
|
286
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
287
|
+
];
|
|
288
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
289
|
+
}
|
|
290
|
+
verifiedMiddleware() {
|
|
291
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
292
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
293
|
+
}
|
|
251
294
|
wrapThrottle(scope, rateLimit, handler) {
|
|
252
295
|
const middleware = [];
|
|
253
296
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
var __jsonParse = (a) => JSON.parse(a);
|
|
3
3
|
|
|
4
4
|
// ../../src/bootstrap/httpKernel.ts
|
|
5
|
+
import {
|
|
6
|
+
hasVerifiedEmail,
|
|
7
|
+
isEmailVerificationRequired
|
|
8
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
5
9
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
6
10
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
7
11
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -17,6 +21,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
17
21
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
18
22
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
19
23
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
24
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
25
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
20
26
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
21
27
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
22
28
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -176,6 +182,9 @@ class HttpKernel {
|
|
|
176
182
|
return this.wrapWeb(async (request) => {
|
|
177
183
|
const user = await auth.resolve(request);
|
|
178
184
|
if (user) {
|
|
185
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
186
|
+
return Response.redirect("/email/verify", 302);
|
|
187
|
+
}
|
|
179
188
|
return Response.redirect(home, 302);
|
|
180
189
|
}
|
|
181
190
|
return handler(request);
|
|
@@ -188,24 +197,46 @@ class HttpKernel {
|
|
|
188
197
|
return this.wrapWebAuthenticated(handler);
|
|
189
198
|
}
|
|
190
199
|
wrapWebAuthenticated(handler) {
|
|
191
|
-
|
|
192
|
-
|
|
200
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
201
|
+
}
|
|
202
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
203
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
204
|
+
}
|
|
205
|
+
wrapWebVerified(handler) {
|
|
206
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
207
|
+
}
|
|
208
|
+
wrapWebPasswordConfirm(handler) {
|
|
209
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
210
|
+
verified: true
|
|
211
|
+
});
|
|
193
212
|
}
|
|
194
213
|
wrapWebAbility(ability, handler) {
|
|
195
214
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
196
215
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
197
216
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
198
|
-
const middleware = [
|
|
217
|
+
const middleware = [
|
|
218
|
+
createRequireWebAuthMiddleware(auth),
|
|
219
|
+
...this.verifiedMiddleware(),
|
|
220
|
+
requireAbility(ability)
|
|
221
|
+
];
|
|
199
222
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
200
223
|
}
|
|
201
224
|
wrapWebGlobalAdmin(handler) {
|
|
202
225
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
203
|
-
const middleware = [
|
|
226
|
+
const middleware = [
|
|
227
|
+
createRequireWebAuthMiddleware(auth),
|
|
228
|
+
...this.verifiedMiddleware(),
|
|
229
|
+
createRequireGlobalAdminMiddleware()
|
|
230
|
+
];
|
|
204
231
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
205
232
|
}
|
|
206
233
|
wrapAuthenticated(handler) {
|
|
207
234
|
return this.wrap("authenticated", handler);
|
|
208
235
|
}
|
|
236
|
+
wrapVerified(handler) {
|
|
237
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
238
|
+
return withMiddleware(...middleware)(handler);
|
|
239
|
+
}
|
|
209
240
|
wrapPublicRead(handler) {
|
|
210
241
|
if (isPublicReadsEnabled()) {
|
|
211
242
|
return handler;
|
|
@@ -236,6 +267,18 @@ class HttpKernel {
|
|
|
236
267
|
wrapRegister(handler) {
|
|
237
268
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
238
269
|
}
|
|
270
|
+
wrapWebAuth(handler, options) {
|
|
271
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
272
|
+
const middleware = [
|
|
273
|
+
createRequireWebAuthMiddleware(auth),
|
|
274
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
275
|
+
];
|
|
276
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
277
|
+
}
|
|
278
|
+
verifiedMiddleware() {
|
|
279
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
280
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
281
|
+
}
|
|
239
282
|
wrapThrottle(scope, rateLimit, handler) {
|
|
240
283
|
const middleware = [];
|
|
241
284
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
|
@@ -11,6 +11,10 @@ import {
|
|
|
11
11
|
} from "@getstrata/core/http/securedRouteModelBinding";
|
|
12
12
|
|
|
13
13
|
// ../../src/bootstrap/httpKernel.ts
|
|
14
|
+
import {
|
|
15
|
+
hasVerifiedEmail,
|
|
16
|
+
isEmailVerificationRequired
|
|
17
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
14
18
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
15
19
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
16
20
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -26,6 +30,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
26
30
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
27
31
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
28
32
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
33
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
34
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
29
35
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
30
36
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
31
37
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -185,6 +191,9 @@ class HttpKernel {
|
|
|
185
191
|
return this.wrapWeb(async (request) => {
|
|
186
192
|
const user = await auth.resolve(request);
|
|
187
193
|
if (user) {
|
|
194
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
195
|
+
return Response.redirect("/email/verify", 302);
|
|
196
|
+
}
|
|
188
197
|
return Response.redirect(home, 302);
|
|
189
198
|
}
|
|
190
199
|
return handler(request);
|
|
@@ -197,24 +206,46 @@ class HttpKernel {
|
|
|
197
206
|
return this.wrapWebAuthenticated(handler);
|
|
198
207
|
}
|
|
199
208
|
wrapWebAuthenticated(handler) {
|
|
200
|
-
|
|
201
|
-
|
|
209
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
210
|
+
}
|
|
211
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
212
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
213
|
+
}
|
|
214
|
+
wrapWebVerified(handler) {
|
|
215
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
216
|
+
}
|
|
217
|
+
wrapWebPasswordConfirm(handler) {
|
|
218
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
219
|
+
verified: true
|
|
220
|
+
});
|
|
202
221
|
}
|
|
203
222
|
wrapWebAbility(ability, handler) {
|
|
204
223
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
205
224
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
206
225
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
207
|
-
const middleware = [
|
|
226
|
+
const middleware = [
|
|
227
|
+
createRequireWebAuthMiddleware(auth),
|
|
228
|
+
...this.verifiedMiddleware(),
|
|
229
|
+
requireAbility(ability)
|
|
230
|
+
];
|
|
208
231
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
209
232
|
}
|
|
210
233
|
wrapWebGlobalAdmin(handler) {
|
|
211
234
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
212
|
-
const middleware = [
|
|
235
|
+
const middleware = [
|
|
236
|
+
createRequireWebAuthMiddleware(auth),
|
|
237
|
+
...this.verifiedMiddleware(),
|
|
238
|
+
createRequireGlobalAdminMiddleware()
|
|
239
|
+
];
|
|
213
240
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
214
241
|
}
|
|
215
242
|
wrapAuthenticated(handler) {
|
|
216
243
|
return this.wrap("authenticated", handler);
|
|
217
244
|
}
|
|
245
|
+
wrapVerified(handler) {
|
|
246
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
247
|
+
return withMiddleware(...middleware)(handler);
|
|
248
|
+
}
|
|
218
249
|
wrapPublicRead(handler) {
|
|
219
250
|
if (isPublicReadsEnabled()) {
|
|
220
251
|
return handler;
|
|
@@ -245,6 +276,18 @@ class HttpKernel {
|
|
|
245
276
|
wrapRegister(handler) {
|
|
246
277
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
247
278
|
}
|
|
279
|
+
wrapWebAuth(handler, options) {
|
|
280
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
281
|
+
const middleware = [
|
|
282
|
+
createRequireWebAuthMiddleware(auth),
|
|
283
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
284
|
+
];
|
|
285
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
286
|
+
}
|
|
287
|
+
verifiedMiddleware() {
|
|
288
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
289
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
290
|
+
}
|
|
248
291
|
wrapThrottle(scope, rateLimit, handler) {
|
|
249
292
|
const middleware = [];
|
|
250
293
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,10 @@ import { conditionalJsonResponse } from "@getstrata/core/http/conditionalRespons
|
|
|
19
19
|
import { applyMiddlewareToRoutes } from "@getstrata/core/http/middleware";
|
|
20
20
|
|
|
21
21
|
// ../../src/bootstrap/httpKernel.ts
|
|
22
|
+
import {
|
|
23
|
+
hasVerifiedEmail,
|
|
24
|
+
isEmailVerificationRequired
|
|
25
|
+
} from "@getstrata/core/auth/emailVerification";
|
|
22
26
|
import { createMembershipMiddleware } from "@getstrata/core/auth/membershipMiddleware";
|
|
23
27
|
import { resolveAbilityChecker } from "@getstrata/core/contracts/serviceTokens";
|
|
24
28
|
import { createAuthMiddleware } from "@getstrata/core/http/authMiddleware";
|
|
@@ -34,6 +38,8 @@ import { requestIdMiddleware } from "@getstrata/core/http/middleware";
|
|
|
34
38
|
import { createRequireAbilityMiddleware } from "@getstrata/core/http/requireAbilityMiddleware";
|
|
35
39
|
import { createRequireAuthMiddleware } from "@getstrata/core/http/requireAuthMiddleware";
|
|
36
40
|
import { createRequireGlobalAdminMiddleware } from "@getstrata/core/http/requireGlobalAdminMiddleware";
|
|
41
|
+
import { createRequirePasswordConfirmMiddleware } from "@getstrata/core/http/requirePasswordConfirmMiddleware";
|
|
42
|
+
import { createRequireVerifiedMiddleware } from "@getstrata/core/http/requireVerifiedMiddleware";
|
|
37
43
|
import { createRequireWebAuthMiddleware } from "@getstrata/core/http/requireWebAuthMiddleware";
|
|
38
44
|
import { withErrorHandling } from "@getstrata/core/http/response";
|
|
39
45
|
import { withMiddleware } from "@getstrata/core/http/routeMiddleware";
|
|
@@ -192,6 +198,9 @@ class HttpKernel {
|
|
|
192
198
|
return this.wrapWeb(async (request) => {
|
|
193
199
|
const user = await auth.resolve(request);
|
|
194
200
|
if (user) {
|
|
201
|
+
if (isEmailVerificationRequired() && !hasVerifiedEmail(user)) {
|
|
202
|
+
return Response.redirect("/email/verify", 302);
|
|
203
|
+
}
|
|
195
204
|
return Response.redirect(home, 302);
|
|
196
205
|
}
|
|
197
206
|
return handler(request);
|
|
@@ -204,24 +213,46 @@ class HttpKernel {
|
|
|
204
213
|
return this.wrapWebAuthenticated(handler);
|
|
205
214
|
}
|
|
206
215
|
wrapWebAuthenticated(handler) {
|
|
207
|
-
|
|
208
|
-
|
|
216
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
217
|
+
}
|
|
218
|
+
wrapWebAuthenticatedAllowUnverified(handler) {
|
|
219
|
+
return this.wrapWebAuth(handler, { verified: false });
|
|
220
|
+
}
|
|
221
|
+
wrapWebVerified(handler) {
|
|
222
|
+
return this.wrapWebAuth(handler, { verified: true });
|
|
223
|
+
}
|
|
224
|
+
wrapWebPasswordConfirm(handler) {
|
|
225
|
+
return this.wrapWebAuth(withMiddleware(createRequirePasswordConfirmMiddleware())(handler), {
|
|
226
|
+
verified: true
|
|
227
|
+
});
|
|
209
228
|
}
|
|
210
229
|
wrapWebAbility(ability, handler) {
|
|
211
230
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
212
231
|
const abilityChecker = resolveAbilityChecker(this.dependencies.container);
|
|
213
232
|
const requireAbility = createRequireAbilityMiddleware(abilityChecker);
|
|
214
|
-
const middleware = [
|
|
233
|
+
const middleware = [
|
|
234
|
+
createRequireWebAuthMiddleware(auth),
|
|
235
|
+
...this.verifiedMiddleware(),
|
|
236
|
+
requireAbility(ability)
|
|
237
|
+
];
|
|
215
238
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
216
239
|
}
|
|
217
240
|
wrapWebGlobalAdmin(handler) {
|
|
218
241
|
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
219
|
-
const middleware = [
|
|
242
|
+
const middleware = [
|
|
243
|
+
createRequireWebAuthMiddleware(auth),
|
|
244
|
+
...this.verifiedMiddleware(),
|
|
245
|
+
createRequireGlobalAdminMiddleware()
|
|
246
|
+
];
|
|
220
247
|
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
221
248
|
}
|
|
222
249
|
wrapAuthenticated(handler) {
|
|
223
250
|
return this.wrap("authenticated", handler);
|
|
224
251
|
}
|
|
252
|
+
wrapVerified(handler) {
|
|
253
|
+
const middleware = [...this.group("authenticated"), ...this.verifiedMiddleware()];
|
|
254
|
+
return withMiddleware(...middleware)(handler);
|
|
255
|
+
}
|
|
225
256
|
wrapPublicRead(handler) {
|
|
226
257
|
if (isPublicReadsEnabled()) {
|
|
227
258
|
return handler;
|
|
@@ -252,6 +283,18 @@ class HttpKernel {
|
|
|
252
283
|
wrapRegister(handler) {
|
|
253
284
|
return this.wrapThrottle("register", resolveRegisterRateLimit(), handler);
|
|
254
285
|
}
|
|
286
|
+
wrapWebAuth(handler, options) {
|
|
287
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
288
|
+
const middleware = [
|
|
289
|
+
createRequireWebAuthMiddleware(auth),
|
|
290
|
+
...options.verified ? this.verifiedMiddleware() : []
|
|
291
|
+
];
|
|
292
|
+
return this.wrapWeb(withMiddleware(...middleware)(handler));
|
|
293
|
+
}
|
|
294
|
+
verifiedMiddleware() {
|
|
295
|
+
const auth = this.dependencies.container.resolve(CORE_AUTH_TOKEN);
|
|
296
|
+
return [createRequireVerifiedMiddleware(auth)];
|
|
297
|
+
}
|
|
255
298
|
wrapThrottle(scope, rateLimit, handler) {
|
|
256
299
|
const middleware = [];
|
|
257
300
|
const memoryKeyPrefix = scope === "login" ? "login-throttle:" : "register-throttle:";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/bootstrap",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.62",
|
|
4
4
|
"description": "Strata application bootstrap — HttpKernel, DI, web session helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -173,14 +173,14 @@
|
|
|
173
173
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta --external @getstrata/core",
|
|
174
174
|
"build:types": "tsc -p tsconfig.types.json && bun ../../scripts/prune-bootstrap-dist-types.ts",
|
|
175
175
|
"prepublishOnly": "bun run build",
|
|
176
|
-
"build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
176
|
+
"build:subpaths": "bun build entries/applicationRegistry.ts entries/buildModuleRoutes.ts entries/buildWebModuleRoutes.ts entries/cache/modelCacheTags.ts entries/config.ts entries/context.ts entries/contracts.ts entries/createWebRoutes.ts entries/createRoutes.ts entries/createSpaRoutes.ts entries/dependencies.ts entries/discoverModules.ts entries/health.ts entries/http/securedRouteModelBinding.ts entries/httpKernel.ts entries/listeners/invalidateCacheOnModelWrite.ts entries/membershipService.ts entries/metricsRoutes.ts entries/queue/defaultJobs.ts entries/providers.ts entries/providers/view.ts entries/routeRegistry.ts entries/schedule.ts entries/secretsGuard.ts entries/web/forms.ts entries/web/routing.ts entries/web/server.ts entries/web/session.ts entries/web/slug.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/bootstrap --external @getstrata/bootstrap/applicationRegistry --external @getstrata/bootstrap/buildModuleRoutes --external @getstrata/bootstrap/buildWebModuleRoutes --external @getstrata/bootstrap/cache/modelCacheTags --external @getstrata/bootstrap/config --external @getstrata/bootstrap/context --external @getstrata/bootstrap/contracts --external @getstrata/bootstrap/createWebRoutes --external @getstrata/bootstrap/createRoutes --external @getstrata/bootstrap/createSpaRoutes --external @getstrata/bootstrap/dependencies --external @getstrata/bootstrap/discoverModules --external @getstrata/bootstrap/health --external @getstrata/bootstrap/http/securedRouteModelBinding --external @getstrata/bootstrap/httpKernel --external @getstrata/bootstrap/listeners/invalidateCacheOnModelWrite --external @getstrata/bootstrap/membershipService --external @getstrata/bootstrap/metricsRoutes --external @getstrata/bootstrap/queue/defaultJobs --external @getstrata/bootstrap/providers --external @getstrata/bootstrap/providers/view --external @getstrata/bootstrap/routeRegistry --external @getstrata/bootstrap/schedule --external @getstrata/bootstrap/secretsGuard --external @getstrata/bootstrap/web/forms --external @getstrata/bootstrap/web/routing --external @getstrata/bootstrap/web/server --external @getstrata/bootstrap/web/session --external @getstrata/bootstrap/web/slug --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/emailVerification --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/passwordConfirmCookie --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/frontendMode --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
177
177
|
"build:shims": "true"
|
|
178
178
|
},
|
|
179
179
|
"publishConfig": {
|
|
180
180
|
"access": "public"
|
|
181
181
|
},
|
|
182
182
|
"peerDependencies": {
|
|
183
|
-
"@getstrata/core": "^0.5.
|
|
183
|
+
"@getstrata/core": "^0.5.75",
|
|
184
184
|
"typescript": "^5.9.0"
|
|
185
185
|
}
|
|
186
186
|
}
|