strapi-plugin-magic-sessionmanager 2.0.1 → 2.0.3
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/admin/jsconfig.json +10 -0
- package/admin/src/components/Initializer.jsx +11 -0
- package/admin/src/components/LicenseGuard.jsx +591 -0
- package/admin/src/components/OnlineUsersWidget.jsx +208 -0
- package/admin/src/components/PluginIcon.jsx +8 -0
- package/admin/src/components/SessionDetailModal.jsx +445 -0
- package/admin/src/components/SessionInfoCard.jsx +151 -0
- package/admin/src/components/SessionInfoPanel.jsx +375 -0
- package/admin/src/components/index.jsx +5 -0
- package/admin/src/hooks/useLicense.js +103 -0
- package/admin/src/index.js +137 -0
- package/admin/src/pages/ActiveSessions.jsx +12 -0
- package/admin/src/pages/Analytics.jsx +735 -0
- package/admin/src/pages/App.jsx +12 -0
- package/admin/src/pages/HomePage.jsx +1248 -0
- package/admin/src/pages/License.jsx +603 -0
- package/admin/src/pages/Settings.jsx +1497 -0
- package/admin/src/pages/SettingsNew.jsx +1204 -0
- package/admin/src/pages/index.jsx +3 -0
- package/admin/src/pluginId.js +3 -0
- package/admin/src/translations/de.json +20 -0
- package/admin/src/translations/en.json +20 -0
- package/admin/src/utils/getTranslation.js +5 -0
- package/admin/src/utils/index.js +2 -0
- package/admin/src/utils/parseUserAgent.js +79 -0
- package/dist/server/index.js +91 -2
- package/dist/server/index.mjs +91 -2
- package/package.json +3 -1
- package/server/jsconfig.json +10 -0
- package/server/src/bootstrap.js +297 -0
- package/server/src/config/index.js +20 -0
- package/server/src/content-types/index.js +9 -0
- package/server/src/content-types/session/schema.json +76 -0
- package/server/src/controllers/controller.js +11 -0
- package/server/src/controllers/index.js +11 -0
- package/server/src/controllers/license.js +266 -0
- package/server/src/controllers/session.js +362 -0
- package/server/src/controllers/settings.js +122 -0
- package/server/src/destroy.js +18 -0
- package/server/src/index.js +23 -0
- package/server/src/middlewares/index.js +5 -0
- package/server/src/middlewares/last-seen.js +56 -0
- package/server/src/policies/index.js +3 -0
- package/server/src/register.js +32 -0
- package/server/src/routes/admin.js +149 -0
- package/server/src/routes/content-api.js +51 -0
- package/server/src/routes/index.js +9 -0
- package/server/src/services/geolocation.js +180 -0
- package/server/src/services/index.js +13 -0
- package/server/src/services/license-guard.js +308 -0
- package/server/src/services/notifications.js +319 -0
- package/server/src/services/service.js +7 -0
- package/server/src/services/session.js +345 -0
- package/server/src/utils/getClientIp.js +118 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugin.name": "Session Manager",
|
|
3
|
+
"plugin.description": "Verfolgung von Benutzer-Login/Logout und Sitzungsaktivität",
|
|
4
|
+
"settings.section": "Session Manager",
|
|
5
|
+
"settings.sessions": "Aktive Sitzungen",
|
|
6
|
+
"settings.emailTemplates.title": "E-Mail Templates",
|
|
7
|
+
"settings.emailTemplates.description": "Passe E-Mail-Benachrichtigungen mit dynamischen Variablen an",
|
|
8
|
+
"settings.emailTemplates.validate": "Validieren",
|
|
9
|
+
"settings.emailTemplates.loadDefault": "Standard-Template laden",
|
|
10
|
+
"settings.emailTemplates.subject": "E-Mail Betreff",
|
|
11
|
+
"settings.emailTemplates.htmlTemplate": "HTML Template",
|
|
12
|
+
"settings.emailTemplates.textTemplate": "Text Template (Fallback)",
|
|
13
|
+
"settings.emailTemplates.variables": "Verfügbare Variablen (klicken zum Kopieren)",
|
|
14
|
+
"settings.emailTemplates.validation.success": "Template gültig! {count} Variablen gefunden.",
|
|
15
|
+
"settings.emailTemplates.validation.warning": "Keine Variablen im Template gefunden. Füge mindestens eine Variable hinzu.",
|
|
16
|
+
"settings.emailTemplates.defaultLoaded": "Standard-Template geladen!",
|
|
17
|
+
"settings.emailTemplates.suspiciousLogin": "Verdächtiger Login",
|
|
18
|
+
"settings.emailTemplates.newLocation": "Neuer Standort",
|
|
19
|
+
"settings.emailTemplates.vpnProxy": "VPN/Proxy"
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugin.name": "Session Manager",
|
|
3
|
+
"plugin.description": "Track user login/logout and session activity",
|
|
4
|
+
"settings.section": "Session Manager",
|
|
5
|
+
"settings.sessions": "Active Sessions",
|
|
6
|
+
"settings.emailTemplates.title": "Email Templates",
|
|
7
|
+
"settings.emailTemplates.description": "Customize email notification templates with dynamic variables",
|
|
8
|
+
"settings.emailTemplates.validate": "Validate",
|
|
9
|
+
"settings.emailTemplates.loadDefault": "Load Default Template",
|
|
10
|
+
"settings.emailTemplates.subject": "Email Subject",
|
|
11
|
+
"settings.emailTemplates.htmlTemplate": "HTML Template",
|
|
12
|
+
"settings.emailTemplates.textTemplate": "Text Template (Fallback)",
|
|
13
|
+
"settings.emailTemplates.variables": "Available Variables (click to copy)",
|
|
14
|
+
"settings.emailTemplates.validation.success": "Template valid! Found {count} variables.",
|
|
15
|
+
"settings.emailTemplates.validation.warning": "No variables found in template. Add at least one variable.",
|
|
16
|
+
"settings.emailTemplates.defaultLoaded": "Default template loaded!",
|
|
17
|
+
"settings.emailTemplates.suspiciousLogin": "Suspicious Login",
|
|
18
|
+
"settings.emailTemplates.newLocation": "New Location",
|
|
19
|
+
"settings.emailTemplates.vpnProxy": "VPN/Proxy"
|
|
20
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse User Agent to extract device and browser info
|
|
3
|
+
* Returns human-readable device type and browser name
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const parseUserAgent = (userAgent) => {
|
|
7
|
+
if (!userAgent) {
|
|
8
|
+
return {
|
|
9
|
+
device: 'Unknown',
|
|
10
|
+
deviceIcon: '❓',
|
|
11
|
+
browser: 'Unknown',
|
|
12
|
+
os: 'Unknown',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const ua = userAgent.toLowerCase();
|
|
17
|
+
|
|
18
|
+
// Device detection
|
|
19
|
+
let device = 'Desktop';
|
|
20
|
+
let deviceIcon = '💻';
|
|
21
|
+
|
|
22
|
+
if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
|
|
23
|
+
device = 'Tablet';
|
|
24
|
+
deviceIcon = '📱';
|
|
25
|
+
} else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(userAgent)) {
|
|
26
|
+
device = 'Mobile';
|
|
27
|
+
deviceIcon = '📱';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Browser detection
|
|
31
|
+
let browser = 'Unknown';
|
|
32
|
+
if (ua.includes('edg/')) {
|
|
33
|
+
browser = 'Edge';
|
|
34
|
+
} else if (ua.includes('chrome/') && !ua.includes('edg/')) {
|
|
35
|
+
browser = 'Chrome';
|
|
36
|
+
} else if (ua.includes('firefox/')) {
|
|
37
|
+
browser = 'Firefox';
|
|
38
|
+
} else if (ua.includes('safari/') && !ua.includes('chrome/')) {
|
|
39
|
+
browser = 'Safari';
|
|
40
|
+
} else if (ua.includes('opera/') || ua.includes('opr/')) {
|
|
41
|
+
browser = 'Opera';
|
|
42
|
+
} else if (ua.includes('curl/')) {
|
|
43
|
+
browser = 'cURL';
|
|
44
|
+
deviceIcon = '⚙️';
|
|
45
|
+
device = 'API Client';
|
|
46
|
+
} else if (ua.includes('postman')) {
|
|
47
|
+
browser = 'Postman';
|
|
48
|
+
deviceIcon = '📮';
|
|
49
|
+
device = 'API Client';
|
|
50
|
+
} else if (ua.includes('insomnia')) {
|
|
51
|
+
browser = 'Insomnia';
|
|
52
|
+
deviceIcon = '🌙';
|
|
53
|
+
device = 'API Client';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// OS detection
|
|
57
|
+
let os = 'Unknown';
|
|
58
|
+
if (ua.includes('windows')) {
|
|
59
|
+
os = 'Windows';
|
|
60
|
+
} else if (ua.includes('mac os x') || ua.includes('macintosh')) {
|
|
61
|
+
os = 'macOS';
|
|
62
|
+
} else if (ua.includes('linux')) {
|
|
63
|
+
os = 'Linux';
|
|
64
|
+
} else if (ua.includes('android')) {
|
|
65
|
+
os = 'Android';
|
|
66
|
+
} else if (ua.includes('iphone') || ua.includes('ipad')) {
|
|
67
|
+
os = 'iOS';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
device,
|
|
72
|
+
deviceIcon,
|
|
73
|
+
browser,
|
|
74
|
+
os,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default parseUserAgent;
|
|
79
|
+
|
package/dist/server/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const require$$0 = require("crypto");
|
|
2
|
+
const require$$0$1 = require("crypto");
|
|
3
3
|
const require$$1 = require("os");
|
|
4
4
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
5
|
-
const require$$0__default = /* @__PURE__ */ _interopDefault(require$$0);
|
|
5
|
+
const require$$0__default = /* @__PURE__ */ _interopDefault(require$$0$1);
|
|
6
6
|
const require$$1__default = /* @__PURE__ */ _interopDefault(require$$1);
|
|
7
7
|
function getDefaultExportFromCjs(x) {
|
|
8
8
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
@@ -366,6 +366,93 @@ var config$1 = {
|
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
368
|
};
|
|
369
|
+
const kind = "collectionType";
|
|
370
|
+
const collectionName = "sessions";
|
|
371
|
+
const info = {
|
|
372
|
+
singularName: "session",
|
|
373
|
+
pluralName: "sessions",
|
|
374
|
+
displayName: "Session",
|
|
375
|
+
description: "User session tracking with IP, device, and activity information"
|
|
376
|
+
};
|
|
377
|
+
const options = {
|
|
378
|
+
draftAndPublish: false,
|
|
379
|
+
comment: ""
|
|
380
|
+
};
|
|
381
|
+
const pluginOptions = {
|
|
382
|
+
"content-manager": {
|
|
383
|
+
visible: true
|
|
384
|
+
},
|
|
385
|
+
"content-type-builder": {
|
|
386
|
+
visible: false
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
const attributes = {
|
|
390
|
+
user: {
|
|
391
|
+
type: "relation",
|
|
392
|
+
relation: "manyToOne",
|
|
393
|
+
target: "plugin::users-permissions.user",
|
|
394
|
+
inversedBy: "sessions"
|
|
395
|
+
},
|
|
396
|
+
ipAddress: {
|
|
397
|
+
type: "string",
|
|
398
|
+
maxLength: 45,
|
|
399
|
+
required: true
|
|
400
|
+
},
|
|
401
|
+
userAgent: {
|
|
402
|
+
type: "text",
|
|
403
|
+
maxLength: 500
|
|
404
|
+
},
|
|
405
|
+
token: {
|
|
406
|
+
type: "text",
|
|
407
|
+
"private": true
|
|
408
|
+
},
|
|
409
|
+
loginTime: {
|
|
410
|
+
type: "datetime",
|
|
411
|
+
required: true
|
|
412
|
+
},
|
|
413
|
+
logoutTime: {
|
|
414
|
+
type: "datetime"
|
|
415
|
+
},
|
|
416
|
+
lastActive: {
|
|
417
|
+
type: "datetime"
|
|
418
|
+
},
|
|
419
|
+
isActive: {
|
|
420
|
+
type: "boolean",
|
|
421
|
+
"default": true,
|
|
422
|
+
required: true
|
|
423
|
+
},
|
|
424
|
+
geoLocation: {
|
|
425
|
+
type: "json"
|
|
426
|
+
},
|
|
427
|
+
securityScore: {
|
|
428
|
+
type: "integer",
|
|
429
|
+
min: 0,
|
|
430
|
+
max: 100
|
|
431
|
+
},
|
|
432
|
+
deviceType: {
|
|
433
|
+
type: "string"
|
|
434
|
+
},
|
|
435
|
+
browserName: {
|
|
436
|
+
type: "string"
|
|
437
|
+
},
|
|
438
|
+
osName: {
|
|
439
|
+
type: "string"
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
const require$$0 = {
|
|
443
|
+
kind,
|
|
444
|
+
collectionName,
|
|
445
|
+
info,
|
|
446
|
+
options,
|
|
447
|
+
pluginOptions,
|
|
448
|
+
attributes
|
|
449
|
+
};
|
|
450
|
+
const session$4 = require$$0;
|
|
451
|
+
var contentTypes$1 = {
|
|
452
|
+
"plugin::magic-sessionmanager.session": {
|
|
453
|
+
schema: session$4
|
|
454
|
+
}
|
|
455
|
+
};
|
|
369
456
|
var contentApi$1 = {
|
|
370
457
|
type: "content-api",
|
|
371
458
|
routes: [
|
|
@@ -2109,6 +2196,7 @@ const register = register$1;
|
|
|
2109
2196
|
const bootstrap = bootstrap$1;
|
|
2110
2197
|
const destroy = destroy$1;
|
|
2111
2198
|
const config = config$1;
|
|
2199
|
+
const contentTypes = contentTypes$1;
|
|
2112
2200
|
const routes = routes$1;
|
|
2113
2201
|
const controllers = controllers$1;
|
|
2114
2202
|
const services = services$1;
|
|
@@ -2118,6 +2206,7 @@ var src = {
|
|
|
2118
2206
|
bootstrap,
|
|
2119
2207
|
destroy,
|
|
2120
2208
|
config,
|
|
2209
|
+
contentTypes,
|
|
2121
2210
|
routes,
|
|
2122
2211
|
controllers,
|
|
2123
2212
|
services,
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import require$$0 from "crypto";
|
|
1
|
+
import require$$0$1 from "crypto";
|
|
2
2
|
import require$$1 from "os";
|
|
3
3
|
function getDefaultExportFromCjs(x) {
|
|
4
4
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
@@ -362,6 +362,93 @@ var config$1 = {
|
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
364
|
};
|
|
365
|
+
const kind = "collectionType";
|
|
366
|
+
const collectionName = "sessions";
|
|
367
|
+
const info = {
|
|
368
|
+
singularName: "session",
|
|
369
|
+
pluralName: "sessions",
|
|
370
|
+
displayName: "Session",
|
|
371
|
+
description: "User session tracking with IP, device, and activity information"
|
|
372
|
+
};
|
|
373
|
+
const options = {
|
|
374
|
+
draftAndPublish: false,
|
|
375
|
+
comment: ""
|
|
376
|
+
};
|
|
377
|
+
const pluginOptions = {
|
|
378
|
+
"content-manager": {
|
|
379
|
+
visible: true
|
|
380
|
+
},
|
|
381
|
+
"content-type-builder": {
|
|
382
|
+
visible: false
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
const attributes = {
|
|
386
|
+
user: {
|
|
387
|
+
type: "relation",
|
|
388
|
+
relation: "manyToOne",
|
|
389
|
+
target: "plugin::users-permissions.user",
|
|
390
|
+
inversedBy: "sessions"
|
|
391
|
+
},
|
|
392
|
+
ipAddress: {
|
|
393
|
+
type: "string",
|
|
394
|
+
maxLength: 45,
|
|
395
|
+
required: true
|
|
396
|
+
},
|
|
397
|
+
userAgent: {
|
|
398
|
+
type: "text",
|
|
399
|
+
maxLength: 500
|
|
400
|
+
},
|
|
401
|
+
token: {
|
|
402
|
+
type: "text",
|
|
403
|
+
"private": true
|
|
404
|
+
},
|
|
405
|
+
loginTime: {
|
|
406
|
+
type: "datetime",
|
|
407
|
+
required: true
|
|
408
|
+
},
|
|
409
|
+
logoutTime: {
|
|
410
|
+
type: "datetime"
|
|
411
|
+
},
|
|
412
|
+
lastActive: {
|
|
413
|
+
type: "datetime"
|
|
414
|
+
},
|
|
415
|
+
isActive: {
|
|
416
|
+
type: "boolean",
|
|
417
|
+
"default": true,
|
|
418
|
+
required: true
|
|
419
|
+
},
|
|
420
|
+
geoLocation: {
|
|
421
|
+
type: "json"
|
|
422
|
+
},
|
|
423
|
+
securityScore: {
|
|
424
|
+
type: "integer",
|
|
425
|
+
min: 0,
|
|
426
|
+
max: 100
|
|
427
|
+
},
|
|
428
|
+
deviceType: {
|
|
429
|
+
type: "string"
|
|
430
|
+
},
|
|
431
|
+
browserName: {
|
|
432
|
+
type: "string"
|
|
433
|
+
},
|
|
434
|
+
osName: {
|
|
435
|
+
type: "string"
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
const require$$0 = {
|
|
439
|
+
kind,
|
|
440
|
+
collectionName,
|
|
441
|
+
info,
|
|
442
|
+
options,
|
|
443
|
+
pluginOptions,
|
|
444
|
+
attributes
|
|
445
|
+
};
|
|
446
|
+
const session$4 = require$$0;
|
|
447
|
+
var contentTypes$1 = {
|
|
448
|
+
"plugin::magic-sessionmanager.session": {
|
|
449
|
+
schema: session$4
|
|
450
|
+
}
|
|
451
|
+
};
|
|
365
452
|
var contentApi$1 = {
|
|
366
453
|
type: "content-api",
|
|
367
454
|
routes: [
|
|
@@ -1400,7 +1487,7 @@ var session$1 = ({ strapi: strapi2 }) => ({
|
|
|
1400
1487
|
}
|
|
1401
1488
|
}
|
|
1402
1489
|
});
|
|
1403
|
-
const crypto = require$$0;
|
|
1490
|
+
const crypto = require$$0$1;
|
|
1404
1491
|
const os = require$$1;
|
|
1405
1492
|
const LICENSE_SERVER_URL = "https://magicapi.fitlex.me";
|
|
1406
1493
|
var licenseGuard$1 = ({ strapi: strapi2 }) => ({
|
|
@@ -2105,6 +2192,7 @@ const register = register$1;
|
|
|
2105
2192
|
const bootstrap = bootstrap$1;
|
|
2106
2193
|
const destroy = destroy$1;
|
|
2107
2194
|
const config = config$1;
|
|
2195
|
+
const contentTypes = contentTypes$1;
|
|
2108
2196
|
const routes = routes$1;
|
|
2109
2197
|
const controllers = controllers$1;
|
|
2110
2198
|
const services = services$1;
|
|
@@ -2114,6 +2202,7 @@ var src = {
|
|
|
2114
2202
|
bootstrap,
|
|
2115
2203
|
destroy,
|
|
2116
2204
|
config,
|
|
2205
|
+
contentTypes,
|
|
2117
2206
|
routes,
|
|
2118
2207
|
controllers,
|
|
2119
2208
|
services,
|
package/package.json
CHANGED