@intranefr/superbackend 1.5.3 → 1.6.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 (106) hide show
  1. package/cookies.txt +6 -0
  2. package/cookies1.txt +6 -0
  3. package/cookies2.txt +6 -0
  4. package/cookies3.txt +6 -0
  5. package/cookies4.txt +5 -0
  6. package/cookies_old.txt +5 -0
  7. package/cookies_old_test.txt +6 -0
  8. package/cookies_super.txt +5 -0
  9. package/cookies_super_test.txt +6 -0
  10. package/cookies_test.txt +6 -0
  11. package/index.js +7 -0
  12. package/package.json +3 -1
  13. package/plugins/core-waiting-list-migration/README.md +118 -0
  14. package/plugins/core-waiting-list-migration/index.js +438 -0
  15. package/plugins/global-settings-presets/index.js +20 -0
  16. package/plugins/hello-cli/index.js +17 -0
  17. package/plugins/ui-components-seeder/components/suiAlert.js +212 -0
  18. package/plugins/ui-components-seeder/components/suiToast.js +186 -0
  19. package/plugins/ui-components-seeder/index.js +31 -0
  20. package/public/js/admin-ui-components-preview.js +281 -0
  21. package/public/js/admin-ui-components.js +408 -0
  22. package/public/js/llm-provider-model-picker.js +193 -0
  23. package/public/test-iframe-fix.html +63 -0
  24. package/public/test-iframe.html +14 -0
  25. package/src/admin/endpointRegistry.js +68 -0
  26. package/src/controllers/admin.controller.js +25 -5
  27. package/src/controllers/adminDataCleanup.controller.js +45 -0
  28. package/src/controllers/adminLlm.controller.js +0 -8
  29. package/src/controllers/adminLogin.controller.js +269 -0
  30. package/src/controllers/adminPlugins.controller.js +55 -0
  31. package/src/controllers/adminRegistry.controller.js +106 -0
  32. package/src/controllers/adminStats.controller.js +4 -4
  33. package/src/controllers/registry.controller.js +32 -0
  34. package/src/controllers/waitingList.controller.js +52 -74
  35. package/src/middleware/auth.js +71 -1
  36. package/src/middleware/rbac.js +62 -0
  37. package/src/middleware.js +454 -153
  38. package/src/models/GlobalSetting.js +11 -1
  39. package/src/models/UiComponent.js +2 -0
  40. package/src/models/User.js +1 -1
  41. package/src/routes/admin.routes.js +3 -3
  42. package/src/routes/adminAgents.routes.js +2 -2
  43. package/src/routes/adminAssets.routes.js +11 -11
  44. package/src/routes/adminBlog.routes.js +2 -2
  45. package/src/routes/adminBlogAi.routes.js +2 -2
  46. package/src/routes/adminBlogAutomation.routes.js +2 -2
  47. package/src/routes/adminCache.routes.js +2 -2
  48. package/src/routes/adminConsoleManager.routes.js +2 -2
  49. package/src/routes/adminCrons.routes.js +2 -2
  50. package/src/routes/adminDataCleanup.routes.js +26 -0
  51. package/src/routes/adminDbBrowser.routes.js +2 -2
  52. package/src/routes/adminEjsVirtual.routes.js +2 -2
  53. package/src/routes/adminFeatureFlags.routes.js +6 -6
  54. package/src/routes/adminHeadless.routes.js +2 -2
  55. package/src/routes/adminHealthChecks.routes.js +2 -2
  56. package/src/routes/adminI18n.routes.js +2 -2
  57. package/src/routes/adminJsonConfigs.routes.js +8 -8
  58. package/src/routes/adminLlm.routes.js +8 -8
  59. package/src/routes/adminLogin.routes.js +23 -0
  60. package/src/routes/adminMarkdowns.routes.js +3 -9
  61. package/src/routes/adminMigration.routes.js +12 -12
  62. package/src/routes/adminPages.routes.js +2 -2
  63. package/src/routes/adminPlugins.routes.js +15 -0
  64. package/src/routes/adminProxy.routes.js +2 -2
  65. package/src/routes/adminRateLimits.routes.js +8 -8
  66. package/src/routes/adminRbac.routes.js +2 -2
  67. package/src/routes/adminRegistry.routes.js +24 -0
  68. package/src/routes/adminScripts.routes.js +2 -2
  69. package/src/routes/adminSeoConfig.routes.js +10 -10
  70. package/src/routes/adminTelegram.routes.js +2 -2
  71. package/src/routes/adminTerminals.routes.js +2 -2
  72. package/src/routes/adminUiComponents.routes.js +2 -2
  73. package/src/routes/adminUploadNamespaces.routes.js +7 -7
  74. package/src/routes/blogInternal.routes.js +2 -2
  75. package/src/routes/experiments.routes.js +2 -2
  76. package/src/routes/formsAdmin.routes.js +6 -6
  77. package/src/routes/globalSettings.routes.js +8 -8
  78. package/src/routes/internalExperiments.routes.js +2 -2
  79. package/src/routes/notificationAdmin.routes.js +7 -7
  80. package/src/routes/orgAdmin.routes.js +16 -16
  81. package/src/routes/pages.routes.js +3 -3
  82. package/src/routes/registry.routes.js +11 -0
  83. package/src/routes/stripeAdmin.routes.js +12 -12
  84. package/src/routes/userAdmin.routes.js +7 -7
  85. package/src/routes/waitingListAdmin.routes.js +2 -2
  86. package/src/routes/workflows.routes.js +3 -3
  87. package/src/services/dataCleanup.service.js +286 -0
  88. package/src/services/jsonConfigs.service.js +262 -0
  89. package/src/services/plugins.service.js +348 -0
  90. package/src/services/registry.service.js +452 -0
  91. package/src/services/uiComponents.service.js +180 -0
  92. package/src/services/waitingListJson.service.js +401 -0
  93. package/src/utils/rbac/rightsRegistry.js +118 -0
  94. package/test-access.js +63 -0
  95. package/test-iframe-fix.html +63 -0
  96. package/test-iframe.html +14 -0
  97. package/views/admin-403.ejs +92 -0
  98. package/views/admin-dashboard-home.ejs +52 -2
  99. package/views/admin-dashboard.ejs +143 -2
  100. package/views/admin-data-cleanup.ejs +357 -0
  101. package/views/admin-login.ejs +286 -0
  102. package/views/admin-plugins-system.ejs +223 -0
  103. package/views/admin-ui-components.ejs +82 -402
  104. package/views/admin-users.ejs +207 -11
  105. package/views/partials/dashboard/nav-items.ejs +2 -0
  106. package/views/partials/llm-provider-model-picker.ejs +0 -161
@@ -70,4 +70,74 @@ const requireAdmin = (req, res, next) => {
70
70
  next();
71
71
  };
72
72
 
73
- module.exports = { authenticate, basicAuth, requireAdmin };
73
+ // Admin session authentication middleware - checks session for authenticated admin user
74
+ const adminSessionAuth = (req, res, next) => {
75
+ // Check if session exists and user is authenticated
76
+ if (!req.session || !req.session.authenticated) {
77
+ // Store the originally requested URL for redirect after login
78
+ req.session = req.session || {};
79
+ req.session.returnTo = req.originalUrl;
80
+
81
+ // For API routes, return JSON error
82
+ if (req.xhr || req.headers.accept?.includes('application/json')) {
83
+ return res.status(401).json({
84
+ error: "Authentication required",
85
+ redirectTo: `${req.adminPath || '/admin'}/login`
86
+ });
87
+ }
88
+
89
+ // For web routes, redirect to login page
90
+ return res.redirect(`${req.adminPath || '/admin'}/login`);
91
+ }
92
+
93
+ // Verify session is still valid (check login time)
94
+ const loginTime = new Date(req.session.loginTime);
95
+ const now = new Date();
96
+ const sessionAge = (now - loginTime) / (1000 * 60 * 60); // hours
97
+
98
+ // Session expires after 24 hours
99
+ if (sessionAge > 24) {
100
+ req.session.destroy((err) => {
101
+ if (err) console.error('Error destroying expired session:', err);
102
+ });
103
+
104
+ if (req.xhr || req.headers.accept?.includes('application/json')) {
105
+ return res.status(401).json({
106
+ error: "Session expired",
107
+ redirectTo: `${req.adminPath || '/admin'}/login`
108
+ });
109
+ }
110
+
111
+ return res.redirect(`${req.adminPath || '/admin'}/login?error=Session expired`);
112
+ }
113
+
114
+ // Attach user info to request for consistency with other auth middleware
115
+ req.user = {
116
+ authenticated: true,
117
+ authType: req.session.authType,
118
+ role: req.session.role
119
+ };
120
+
121
+ if (req.session.authType === 'iam') {
122
+ req.user.id = req.session.userId;
123
+ req.user.email = req.session.email;
124
+ req.user.name = req.session.name;
125
+ } else {
126
+ req.user.username = req.session.username;
127
+ }
128
+
129
+ next();
130
+ };
131
+
132
+ // Admin authentication middleware that supports both session and basic auth
133
+ const adminAuth = (req, res, next) => {
134
+ // First try session authentication
135
+ if (req.session && req.session.authenticated) {
136
+ return adminSessionAuth(req, res, next);
137
+ }
138
+
139
+ // Fallback to basic auth for backward compatibility
140
+ return basicAuth(req, res, next);
141
+ };
142
+
143
+ module.exports = { authenticate, basicAuth, requireAdmin, adminSessionAuth, adminAuth };
@@ -56,7 +56,69 @@ function requireRight(requiredRight, options = {}) {
56
56
  };
57
57
  }
58
58
 
59
+ /**
60
+ * Middleware for module-level access control in admin panel
61
+ * Checks specific permissions for admin modules like audit, users, etc.
62
+ */
63
+ function requireModuleAccess(moduleId, action = 'read') {
64
+ return async (req, res, next) => {
65
+ try {
66
+ // Check for basic auth superadmin bypass
67
+ if (isBasicAuthSuperAdmin(req)) {
68
+ return next();
69
+ }
70
+
71
+ // Get user ID from session
72
+ const userId = req.session?.authData?.userId;
73
+ if (!userId) {
74
+ return res.redirect(`${req.adminPath || '/admin'}/login`);
75
+ }
76
+
77
+ // Check RBAC permission for specific module
78
+ const hasAccess = await rbacService.checkRight({
79
+ userId,
80
+ orgId: null, // Global admin permissions
81
+ right: `admin_panel__${moduleId}:${action}`
82
+ });
83
+
84
+ if (!hasAccess.allowed) {
85
+ // For API routes, return JSON error
86
+ if (req.path.startsWith('/api/')) {
87
+ return res.status(403).json({
88
+ error: 'Access denied',
89
+ reason: hasAccess.reason,
90
+ required: `admin_panel__${moduleId}:${action}`,
91
+ moduleId,
92
+ action
93
+ });
94
+ }
95
+
96
+ // For page routes, render 403 page
97
+ return res.status(403).render('admin-403', {
98
+ moduleId,
99
+ action,
100
+ required: `admin_panel__${moduleId}:${action}`,
101
+ reason: hasAccess.reason,
102
+ user: req.session.authData,
103
+ adminPath: req.adminPath || '/admin'
104
+ });
105
+ }
106
+
107
+ next();
108
+ } catch (error) {
109
+ console.error('Module access check error:', error);
110
+
111
+ if (req.path.startsWith('/api/')) {
112
+ return res.status(500).json({ error: 'Access check failed' });
113
+ } else {
114
+ return res.status(500).send('Access check failed');
115
+ }
116
+ }
117
+ };
118
+ }
119
+
59
120
  module.exports = {
60
121
  requireRight,
122
+ requireModuleAccess,
61
123
  isBasicAuthSuperAdmin,
62
124
  };