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.
Files changed (54) hide show
  1. package/admin/jsconfig.json +10 -0
  2. package/admin/src/components/Initializer.jsx +11 -0
  3. package/admin/src/components/LicenseGuard.jsx +591 -0
  4. package/admin/src/components/OnlineUsersWidget.jsx +208 -0
  5. package/admin/src/components/PluginIcon.jsx +8 -0
  6. package/admin/src/components/SessionDetailModal.jsx +445 -0
  7. package/admin/src/components/SessionInfoCard.jsx +151 -0
  8. package/admin/src/components/SessionInfoPanel.jsx +375 -0
  9. package/admin/src/components/index.jsx +5 -0
  10. package/admin/src/hooks/useLicense.js +103 -0
  11. package/admin/src/index.js +137 -0
  12. package/admin/src/pages/ActiveSessions.jsx +12 -0
  13. package/admin/src/pages/Analytics.jsx +735 -0
  14. package/admin/src/pages/App.jsx +12 -0
  15. package/admin/src/pages/HomePage.jsx +1248 -0
  16. package/admin/src/pages/License.jsx +603 -0
  17. package/admin/src/pages/Settings.jsx +1497 -0
  18. package/admin/src/pages/SettingsNew.jsx +1204 -0
  19. package/admin/src/pages/index.jsx +3 -0
  20. package/admin/src/pluginId.js +3 -0
  21. package/admin/src/translations/de.json +20 -0
  22. package/admin/src/translations/en.json +20 -0
  23. package/admin/src/utils/getTranslation.js +5 -0
  24. package/admin/src/utils/index.js +2 -0
  25. package/admin/src/utils/parseUserAgent.js +79 -0
  26. package/dist/server/index.js +91 -2
  27. package/dist/server/index.mjs +91 -2
  28. package/package.json +3 -1
  29. package/server/jsconfig.json +10 -0
  30. package/server/src/bootstrap.js +297 -0
  31. package/server/src/config/index.js +20 -0
  32. package/server/src/content-types/index.js +9 -0
  33. package/server/src/content-types/session/schema.json +76 -0
  34. package/server/src/controllers/controller.js +11 -0
  35. package/server/src/controllers/index.js +11 -0
  36. package/server/src/controllers/license.js +266 -0
  37. package/server/src/controllers/session.js +362 -0
  38. package/server/src/controllers/settings.js +122 -0
  39. package/server/src/destroy.js +18 -0
  40. package/server/src/index.js +23 -0
  41. package/server/src/middlewares/index.js +5 -0
  42. package/server/src/middlewares/last-seen.js +56 -0
  43. package/server/src/policies/index.js +3 -0
  44. package/server/src/register.js +32 -0
  45. package/server/src/routes/admin.js +149 -0
  46. package/server/src/routes/content-api.js +51 -0
  47. package/server/src/routes/index.js +9 -0
  48. package/server/src/services/geolocation.js +180 -0
  49. package/server/src/services/index.js +13 -0
  50. package/server/src/services/license-guard.js +308 -0
  51. package/server/src/services/notifications.js +319 -0
  52. package/server/src/services/service.js +7 -0
  53. package/server/src/services/session.js +345 -0
  54. package/server/src/utils/getClientIp.js +118 -0
@@ -0,0 +1,3 @@
1
+ export { default as HomePage } from './HomePage';
2
+ export { default as ActiveSessions } from './ActiveSessions';
3
+ export { default as App } from './App';
@@ -0,0 +1,3 @@
1
+ const pluginId = 'magic-sessionmanager';
2
+
3
+ export default pluginId;
@@ -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,5 @@
1
+ import { PLUGIN_ID } from '../pluginId';
2
+
3
+ const getTranslation = (id) => `${PLUGIN_ID}.${id}`;
4
+
5
+ export { getTranslation };
@@ -0,0 +1,2 @@
1
+ export { default as parseUserAgent } from './parseUserAgent';
2
+
@@ -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
+
@@ -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,
@@ -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
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.1",
2
+ "version": "2.0.3",
3
3
  "keywords": [
4
4
  "strapi",
5
5
  "strapi-plugin",
@@ -27,6 +27,8 @@
27
27
  },
28
28
  "files": [
29
29
  "dist",
30
+ "server",
31
+ "admin",
30
32
  "strapi-admin.js",
31
33
  "strapi-server.js",
32
34
  "README.md",
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es6",
4
+ "module": "commonjs",
5
+ "allowSyntheticDefaultImports": true,
6
+ "esModuleInterop": true
7
+ },
8
+ "include": ["./src/**/*.js"],
9
+ "exclude": ["node_modules"]
10
+ }