@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.
- package/cookies.txt +6 -0
- package/cookies1.txt +6 -0
- package/cookies2.txt +6 -0
- package/cookies3.txt +6 -0
- package/cookies4.txt +5 -0
- package/cookies_old.txt +5 -0
- package/cookies_old_test.txt +6 -0
- package/cookies_super.txt +5 -0
- package/cookies_super_test.txt +6 -0
- package/cookies_test.txt +6 -0
- package/index.js +7 -0
- package/package.json +3 -1
- package/plugins/core-waiting-list-migration/README.md +118 -0
- package/plugins/core-waiting-list-migration/index.js +438 -0
- package/plugins/global-settings-presets/index.js +20 -0
- package/plugins/hello-cli/index.js +17 -0
- package/plugins/ui-components-seeder/components/suiAlert.js +212 -0
- package/plugins/ui-components-seeder/components/suiToast.js +186 -0
- package/plugins/ui-components-seeder/index.js +31 -0
- package/public/js/admin-ui-components-preview.js +281 -0
- package/public/js/admin-ui-components.js +408 -0
- package/public/js/llm-provider-model-picker.js +193 -0
- package/public/test-iframe-fix.html +63 -0
- package/public/test-iframe.html +14 -0
- package/src/admin/endpointRegistry.js +68 -0
- package/src/controllers/admin.controller.js +25 -5
- package/src/controllers/adminDataCleanup.controller.js +45 -0
- package/src/controllers/adminLlm.controller.js +0 -8
- package/src/controllers/adminLogin.controller.js +269 -0
- package/src/controllers/adminPlugins.controller.js +55 -0
- package/src/controllers/adminRegistry.controller.js +106 -0
- package/src/controllers/adminStats.controller.js +4 -4
- package/src/controllers/registry.controller.js +32 -0
- package/src/controllers/waitingList.controller.js +52 -74
- package/src/middleware/auth.js +71 -1
- package/src/middleware/rbac.js +62 -0
- package/src/middleware.js +454 -153
- package/src/models/GlobalSetting.js +11 -1
- package/src/models/UiComponent.js +2 -0
- package/src/models/User.js +1 -1
- package/src/routes/admin.routes.js +3 -3
- package/src/routes/adminAgents.routes.js +2 -2
- package/src/routes/adminAssets.routes.js +11 -11
- package/src/routes/adminBlog.routes.js +2 -2
- package/src/routes/adminBlogAi.routes.js +2 -2
- package/src/routes/adminBlogAutomation.routes.js +2 -2
- package/src/routes/adminCache.routes.js +2 -2
- package/src/routes/adminConsoleManager.routes.js +2 -2
- package/src/routes/adminCrons.routes.js +2 -2
- package/src/routes/adminDataCleanup.routes.js +26 -0
- package/src/routes/adminDbBrowser.routes.js +2 -2
- package/src/routes/adminEjsVirtual.routes.js +2 -2
- package/src/routes/adminFeatureFlags.routes.js +6 -6
- package/src/routes/adminHeadless.routes.js +2 -2
- package/src/routes/adminHealthChecks.routes.js +2 -2
- package/src/routes/adminI18n.routes.js +2 -2
- package/src/routes/adminJsonConfigs.routes.js +8 -8
- package/src/routes/adminLlm.routes.js +8 -8
- package/src/routes/adminLogin.routes.js +23 -0
- package/src/routes/adminMarkdowns.routes.js +3 -9
- package/src/routes/adminMigration.routes.js +12 -12
- package/src/routes/adminPages.routes.js +2 -2
- package/src/routes/adminPlugins.routes.js +15 -0
- package/src/routes/adminProxy.routes.js +2 -2
- package/src/routes/adminRateLimits.routes.js +8 -8
- package/src/routes/adminRbac.routes.js +2 -2
- package/src/routes/adminRegistry.routes.js +24 -0
- package/src/routes/adminScripts.routes.js +2 -2
- package/src/routes/adminSeoConfig.routes.js +10 -10
- package/src/routes/adminTelegram.routes.js +2 -2
- package/src/routes/adminTerminals.routes.js +2 -2
- package/src/routes/adminUiComponents.routes.js +2 -2
- package/src/routes/adminUploadNamespaces.routes.js +7 -7
- package/src/routes/blogInternal.routes.js +2 -2
- package/src/routes/experiments.routes.js +2 -2
- package/src/routes/formsAdmin.routes.js +6 -6
- package/src/routes/globalSettings.routes.js +8 -8
- package/src/routes/internalExperiments.routes.js +2 -2
- package/src/routes/notificationAdmin.routes.js +7 -7
- package/src/routes/orgAdmin.routes.js +16 -16
- package/src/routes/pages.routes.js +3 -3
- package/src/routes/registry.routes.js +11 -0
- package/src/routes/stripeAdmin.routes.js +12 -12
- package/src/routes/userAdmin.routes.js +7 -7
- package/src/routes/waitingListAdmin.routes.js +2 -2
- package/src/routes/workflows.routes.js +3 -3
- package/src/services/dataCleanup.service.js +286 -0
- package/src/services/jsonConfigs.service.js +262 -0
- package/src/services/plugins.service.js +348 -0
- package/src/services/registry.service.js +452 -0
- package/src/services/uiComponents.service.js +180 -0
- package/src/services/waitingListJson.service.js +401 -0
- package/src/utils/rbac/rightsRegistry.js +118 -0
- package/test-access.js +63 -0
- package/test-iframe-fix.html +63 -0
- package/test-iframe.html +14 -0
- package/views/admin-403.ejs +92 -0
- package/views/admin-dashboard-home.ejs +52 -2
- package/views/admin-dashboard.ejs +143 -2
- package/views/admin-data-cleanup.ejs +357 -0
- package/views/admin-login.ejs +286 -0
- package/views/admin-plugins-system.ejs +223 -0
- package/views/admin-ui-components.ejs +82 -402
- package/views/admin-users.ejs +207 -11
- package/views/partials/dashboard/nav-items.ejs +2 -0
- package/views/partials/llm-provider-model-picker.ejs +0 -161
package/src/middleware/auth.js
CHANGED
|
@@ -70,4 +70,74 @@ const requireAdmin = (req, res, next) => {
|
|
|
70
70
|
next();
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
-
|
|
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 };
|
package/src/middleware/rbac.js
CHANGED
|
@@ -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
|
};
|