strapi-plugin-magic-sessionmanager 4.2.15 → 4.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/index.js +47 -97
- package/dist/server/index.mjs +47 -97
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -206,7 +206,7 @@ function generateSessionId$1(userId) {
|
|
|
206
206
|
const userHash = crypto$1.createHash("sha256").update(userId.toString()).digest("hex").substring(0, 8);
|
|
207
207
|
return `sess_${timestamp}_${userHash}_${randomBytes}`;
|
|
208
208
|
}
|
|
209
|
-
function hashToken$
|
|
209
|
+
function hashToken$3(token) {
|
|
210
210
|
if (!token) return null;
|
|
211
211
|
return crypto$1.createHash("sha256").update(token).digest("hex");
|
|
212
212
|
}
|
|
@@ -214,113 +214,63 @@ var encryption = {
|
|
|
214
214
|
encryptToken: encryptToken$2,
|
|
215
215
|
decryptToken: decryptToken$3,
|
|
216
216
|
generateSessionId: generateSessionId$1,
|
|
217
|
-
hashToken: hashToken$
|
|
217
|
+
hashToken: hashToken$3
|
|
218
218
|
};
|
|
219
219
|
const SESSION_UID$3 = "plugin::magic-sessionmanager.session";
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
220
|
+
const AUTH_PATTERNS = [
|
|
221
|
+
"/auth/",
|
|
222
|
+
// All /api/auth/* endpoints (login, logout, refresh, etc.)
|
|
223
|
+
"/magic-link/",
|
|
224
|
+
// All Magic-Link endpoints
|
|
225
|
+
"/passwordless/",
|
|
226
|
+
// Legacy passwordless endpoints
|
|
227
|
+
"/otp/",
|
|
228
|
+
// OTP endpoints (any plugin)
|
|
229
|
+
"/login",
|
|
230
|
+
// Any login endpoint
|
|
231
|
+
"/register",
|
|
232
|
+
// Any register endpoint
|
|
233
|
+
"/forgot-password",
|
|
234
|
+
// Password reset
|
|
235
|
+
"/reset-password"
|
|
236
|
+
// Password reset
|
|
237
|
+
];
|
|
238
|
+
function isAuthEndpoint(path) {
|
|
239
|
+
return AUTH_PATTERNS.some((pattern) => path.includes(pattern));
|
|
233
240
|
}
|
|
234
|
-
var lastSeen = ({ strapi: strapi2 }) => {
|
|
241
|
+
var lastSeen = ({ strapi: strapi2, sessionService }) => {
|
|
235
242
|
return async (ctx, next) => {
|
|
236
|
-
|
|
237
|
-
if (!currentToken) {
|
|
238
|
-
await next();
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
const skipPaths = [
|
|
242
|
-
"/admin",
|
|
243
|
-
// Admin panel UI
|
|
244
|
-
"/content-manager",
|
|
245
|
-
// Content Manager
|
|
246
|
-
"/content-type-builder",
|
|
247
|
-
// Content-Type Builder
|
|
248
|
-
"/upload",
|
|
249
|
-
// Media Library
|
|
250
|
-
"/i18n",
|
|
251
|
-
// Internationalization
|
|
252
|
-
"/users-permissions",
|
|
253
|
-
// Users & Permissions settings
|
|
254
|
-
"/email",
|
|
255
|
-
// Email plugin
|
|
256
|
-
"/_health",
|
|
257
|
-
// Health check
|
|
258
|
-
"/favicon.ico",
|
|
259
|
-
// Static assets
|
|
260
|
-
"/api/auth/local",
|
|
261
|
-
// Login endpoint
|
|
262
|
-
"/api/auth/register",
|
|
263
|
-
// Registration endpoint
|
|
264
|
-
"/api/auth/forgot-password",
|
|
265
|
-
// Password reset
|
|
266
|
-
"/api/auth/reset-password",
|
|
267
|
-
// Password reset
|
|
268
|
-
"/api/auth/logout",
|
|
269
|
-
// Logout endpoint (handled separately)
|
|
270
|
-
"/api/auth/refresh",
|
|
271
|
-
// Refresh token (has own validation in bootstrap.js)
|
|
272
|
-
"/api/connect",
|
|
273
|
-
// OAuth providers
|
|
274
|
-
"/api/magic-link"
|
|
275
|
-
// Magic link auth (if using magic-link plugin)
|
|
276
|
-
];
|
|
277
|
-
if (skipPaths.some((p) => ctx.path.startsWith(p))) {
|
|
278
|
-
await next();
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
if (!ctx.path.startsWith("/api/")) {
|
|
243
|
+
if (isAuthEndpoint(ctx.path)) {
|
|
282
244
|
await next();
|
|
283
245
|
return;
|
|
284
246
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (matchingSession.user?.documentId) {
|
|
299
|
-
ctx.state.sessionUserId = matchingSession.user.documentId;
|
|
247
|
+
if (ctx.state.user && ctx.state.user.documentId) {
|
|
248
|
+
try {
|
|
249
|
+
const userId = ctx.state.user.documentId;
|
|
250
|
+
const activeSessions = await strapi2.documents(SESSION_UID$3).findMany({
|
|
251
|
+
filters: {
|
|
252
|
+
user: { documentId: userId },
|
|
253
|
+
isActive: true
|
|
254
|
+
},
|
|
255
|
+
limit: 1
|
|
256
|
+
});
|
|
257
|
+
if (!activeSessions || activeSessions.length === 0) {
|
|
258
|
+
strapi2.log.info(`[magic-sessionmanager] [BLOCKED] Request blocked - session terminated or invalid (user: ${userId.substring(0, 8)}...)`);
|
|
259
|
+
return ctx.unauthorized("All sessions have been terminated. Please login again.");
|
|
300
260
|
}
|
|
301
|
-
}
|
|
302
|
-
strapi2.log.
|
|
303
|
-
return ctx.unauthorized("This session has been terminated. Please login again.");
|
|
261
|
+
} catch (err) {
|
|
262
|
+
strapi2.log.debug("[magic-sessionmanager] Error checking active sessions:", err.message);
|
|
304
263
|
}
|
|
305
|
-
} catch (err) {
|
|
306
|
-
strapi2.log.debug("[magic-sessionmanager] Error checking session:", err.message);
|
|
307
264
|
}
|
|
308
265
|
await next();
|
|
309
|
-
if (
|
|
266
|
+
if (ctx.state.user && ctx.state.user.documentId) {
|
|
310
267
|
try {
|
|
311
|
-
const
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
cleanupOldCacheEntries();
|
|
318
|
-
await strapi2.documents(SESSION_UID$3).update({
|
|
319
|
-
documentId: matchingSession.documentId,
|
|
320
|
-
data: { lastActive: /* @__PURE__ */ new Date() }
|
|
321
|
-
});
|
|
322
|
-
strapi2.log.debug(`[magic-sessionmanager] [TOUCH] Session ${matchingSession.documentId} activity updated`);
|
|
323
|
-
}
|
|
268
|
+
const userId = ctx.state.user.documentId;
|
|
269
|
+
const sessionId = ctx.state.sessionId;
|
|
270
|
+
await sessionService.touch({
|
|
271
|
+
userId,
|
|
272
|
+
sessionId
|
|
273
|
+
});
|
|
324
274
|
} catch (err) {
|
|
325
275
|
strapi2.log.debug("[magic-sessionmanager] Error updating lastSeen:", err.message);
|
|
326
276
|
}
|
|
@@ -2484,7 +2434,7 @@ var session$1 = ({ strapi: strapi2 }) => {
|
|
|
2484
2434
|
}
|
|
2485
2435
|
};
|
|
2486
2436
|
};
|
|
2487
|
-
const version = "4.2.
|
|
2437
|
+
const version = "4.2.15";
|
|
2488
2438
|
const require$$2 = {
|
|
2489
2439
|
version
|
|
2490
2440
|
};
|
package/dist/server/index.mjs
CHANGED
|
@@ -202,7 +202,7 @@ function generateSessionId$1(userId) {
|
|
|
202
202
|
const userHash = crypto$1.createHash("sha256").update(userId.toString()).digest("hex").substring(0, 8);
|
|
203
203
|
return `sess_${timestamp}_${userHash}_${randomBytes}`;
|
|
204
204
|
}
|
|
205
|
-
function hashToken$
|
|
205
|
+
function hashToken$3(token) {
|
|
206
206
|
if (!token) return null;
|
|
207
207
|
return crypto$1.createHash("sha256").update(token).digest("hex");
|
|
208
208
|
}
|
|
@@ -210,113 +210,63 @@ var encryption = {
|
|
|
210
210
|
encryptToken: encryptToken$2,
|
|
211
211
|
decryptToken: decryptToken$3,
|
|
212
212
|
generateSessionId: generateSessionId$1,
|
|
213
|
-
hashToken: hashToken$
|
|
213
|
+
hashToken: hashToken$3
|
|
214
214
|
};
|
|
215
215
|
const SESSION_UID$3 = "plugin::magic-sessionmanager.session";
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
216
|
+
const AUTH_PATTERNS = [
|
|
217
|
+
"/auth/",
|
|
218
|
+
// All /api/auth/* endpoints (login, logout, refresh, etc.)
|
|
219
|
+
"/magic-link/",
|
|
220
|
+
// All Magic-Link endpoints
|
|
221
|
+
"/passwordless/",
|
|
222
|
+
// Legacy passwordless endpoints
|
|
223
|
+
"/otp/",
|
|
224
|
+
// OTP endpoints (any plugin)
|
|
225
|
+
"/login",
|
|
226
|
+
// Any login endpoint
|
|
227
|
+
"/register",
|
|
228
|
+
// Any register endpoint
|
|
229
|
+
"/forgot-password",
|
|
230
|
+
// Password reset
|
|
231
|
+
"/reset-password"
|
|
232
|
+
// Password reset
|
|
233
|
+
];
|
|
234
|
+
function isAuthEndpoint(path) {
|
|
235
|
+
return AUTH_PATTERNS.some((pattern) => path.includes(pattern));
|
|
229
236
|
}
|
|
230
|
-
var lastSeen = ({ strapi: strapi2 }) => {
|
|
237
|
+
var lastSeen = ({ strapi: strapi2, sessionService }) => {
|
|
231
238
|
return async (ctx, next) => {
|
|
232
|
-
|
|
233
|
-
if (!currentToken) {
|
|
234
|
-
await next();
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
const skipPaths = [
|
|
238
|
-
"/admin",
|
|
239
|
-
// Admin panel UI
|
|
240
|
-
"/content-manager",
|
|
241
|
-
// Content Manager
|
|
242
|
-
"/content-type-builder",
|
|
243
|
-
// Content-Type Builder
|
|
244
|
-
"/upload",
|
|
245
|
-
// Media Library
|
|
246
|
-
"/i18n",
|
|
247
|
-
// Internationalization
|
|
248
|
-
"/users-permissions",
|
|
249
|
-
// Users & Permissions settings
|
|
250
|
-
"/email",
|
|
251
|
-
// Email plugin
|
|
252
|
-
"/_health",
|
|
253
|
-
// Health check
|
|
254
|
-
"/favicon.ico",
|
|
255
|
-
// Static assets
|
|
256
|
-
"/api/auth/local",
|
|
257
|
-
// Login endpoint
|
|
258
|
-
"/api/auth/register",
|
|
259
|
-
// Registration endpoint
|
|
260
|
-
"/api/auth/forgot-password",
|
|
261
|
-
// Password reset
|
|
262
|
-
"/api/auth/reset-password",
|
|
263
|
-
// Password reset
|
|
264
|
-
"/api/auth/logout",
|
|
265
|
-
// Logout endpoint (handled separately)
|
|
266
|
-
"/api/auth/refresh",
|
|
267
|
-
// Refresh token (has own validation in bootstrap.js)
|
|
268
|
-
"/api/connect",
|
|
269
|
-
// OAuth providers
|
|
270
|
-
"/api/magic-link"
|
|
271
|
-
// Magic link auth (if using magic-link plugin)
|
|
272
|
-
];
|
|
273
|
-
if (skipPaths.some((p) => ctx.path.startsWith(p))) {
|
|
274
|
-
await next();
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (!ctx.path.startsWith("/api/")) {
|
|
239
|
+
if (isAuthEndpoint(ctx.path)) {
|
|
278
240
|
await next();
|
|
279
241
|
return;
|
|
280
242
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
if (matchingSession.user?.documentId) {
|
|
295
|
-
ctx.state.sessionUserId = matchingSession.user.documentId;
|
|
243
|
+
if (ctx.state.user && ctx.state.user.documentId) {
|
|
244
|
+
try {
|
|
245
|
+
const userId = ctx.state.user.documentId;
|
|
246
|
+
const activeSessions = await strapi2.documents(SESSION_UID$3).findMany({
|
|
247
|
+
filters: {
|
|
248
|
+
user: { documentId: userId },
|
|
249
|
+
isActive: true
|
|
250
|
+
},
|
|
251
|
+
limit: 1
|
|
252
|
+
});
|
|
253
|
+
if (!activeSessions || activeSessions.length === 0) {
|
|
254
|
+
strapi2.log.info(`[magic-sessionmanager] [BLOCKED] Request blocked - session terminated or invalid (user: ${userId.substring(0, 8)}...)`);
|
|
255
|
+
return ctx.unauthorized("All sessions have been terminated. Please login again.");
|
|
296
256
|
}
|
|
297
|
-
}
|
|
298
|
-
strapi2.log.
|
|
299
|
-
return ctx.unauthorized("This session has been terminated. Please login again.");
|
|
257
|
+
} catch (err) {
|
|
258
|
+
strapi2.log.debug("[magic-sessionmanager] Error checking active sessions:", err.message);
|
|
300
259
|
}
|
|
301
|
-
} catch (err) {
|
|
302
|
-
strapi2.log.debug("[magic-sessionmanager] Error checking session:", err.message);
|
|
303
260
|
}
|
|
304
261
|
await next();
|
|
305
|
-
if (
|
|
262
|
+
if (ctx.state.user && ctx.state.user.documentId) {
|
|
306
263
|
try {
|
|
307
|
-
const
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
cleanupOldCacheEntries();
|
|
314
|
-
await strapi2.documents(SESSION_UID$3).update({
|
|
315
|
-
documentId: matchingSession.documentId,
|
|
316
|
-
data: { lastActive: /* @__PURE__ */ new Date() }
|
|
317
|
-
});
|
|
318
|
-
strapi2.log.debug(`[magic-sessionmanager] [TOUCH] Session ${matchingSession.documentId} activity updated`);
|
|
319
|
-
}
|
|
264
|
+
const userId = ctx.state.user.documentId;
|
|
265
|
+
const sessionId = ctx.state.sessionId;
|
|
266
|
+
await sessionService.touch({
|
|
267
|
+
userId,
|
|
268
|
+
sessionId
|
|
269
|
+
});
|
|
320
270
|
} catch (err) {
|
|
321
271
|
strapi2.log.debug("[magic-sessionmanager] Error updating lastSeen:", err.message);
|
|
322
272
|
}
|
|
@@ -2480,7 +2430,7 @@ var session$1 = ({ strapi: strapi2 }) => {
|
|
|
2480
2430
|
}
|
|
2481
2431
|
};
|
|
2482
2432
|
};
|
|
2483
|
-
const version = "4.2.
|
|
2433
|
+
const version = "4.2.15";
|
|
2484
2434
|
const require$$2 = {
|
|
2485
2435
|
version
|
|
2486
2436
|
};
|
package/package.json
CHANGED