mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
Adjust permissions for employee role to access tasks and supplier data, and allow directors to validate DLC products. Replit-Commit-Author: Agent Replit-Commit-Session-Id: b163d4c0-de5e-4f4e-a9c0-aed4c7049718 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/b163d4c0-de5e-4f4e-a9c0-aed4c7049718/69xEJ3P
192 lines
7.3 KiB
JavaScript
192 lines
7.3 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Script de débogage pour identifier les erreurs 403 des employés en production
|
|
* Analyse les routes et permissions pour diagnostiquer les problèmes d'accès
|
|
*/
|
|
|
|
const https = require('https');
|
|
|
|
// Configuration pour le serveur de production
|
|
const PRODUCTION_URL = process.env.PRODUCTION_URL || 'https://votre-serveur-production.com';
|
|
const TEST_EMPLOYEE_CREDENTIALS = {
|
|
username: process.env.TEST_EMPLOYEE_USERNAME || 'test_employee',
|
|
password: process.env.TEST_EMPLOYEE_PASSWORD || 'password123'
|
|
};
|
|
|
|
console.log('🐛 === DÉBOGAGE ERREURS 403 EMPLOYÉS EN PRODUCTION ===\n');
|
|
|
|
// Routes susceptibles de poser problème pour les employés
|
|
const ROUTES_TO_TEST = [
|
|
{ path: '/api/tasks', method: 'GET', description: 'Liste des tâches' },
|
|
{ path: '/api/tasks', method: 'POST', description: 'Création de tâche', data: { title: 'Test', description: 'Test', priority: 'medium', status: 'pending', groupId: 1 } },
|
|
{ path: '/api/suppliers', method: 'GET', description: 'Liste des fournisseurs' },
|
|
{ path: '/api/suppliers?dlc=true', method: 'GET', description: 'Fournisseurs DLC' },
|
|
{ path: '/api/groups', method: 'GET', description: 'Liste des groupes/magasins' },
|
|
{ path: '/api/customer-orders', method: 'GET', description: 'Commandes client' },
|
|
{ path: '/api/dlc-products', method: 'GET', description: 'Produits DLC' },
|
|
{ path: '/api/user', method: 'GET', description: 'Profil utilisateur' }
|
|
];
|
|
|
|
async function makeRequest(path, method = 'GET', data = null, cookies = '') {
|
|
return new Promise((resolve, reject) => {
|
|
const url = new URL(path, PRODUCTION_URL);
|
|
const options = {
|
|
hostname: url.hostname,
|
|
port: url.port || (url.protocol === 'https:' ? 443 : 80),
|
|
path: url.pathname + url.search,
|
|
method: method,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'User-Agent': 'LogiFlow-Debug-Script/1.0',
|
|
...(cookies ? { 'Cookie': cookies } : {}),
|
|
...(data ? { 'Content-Length': Buffer.byteLength(JSON.stringify(data)) } : {})
|
|
}
|
|
};
|
|
|
|
const req = https.request(options, (res) => {
|
|
let body = '';
|
|
res.on('data', (chunk) => body += chunk);
|
|
res.on('end', () => {
|
|
try {
|
|
const parsed = JSON.parse(body);
|
|
resolve({
|
|
status: res.statusCode,
|
|
headers: res.headers,
|
|
data: parsed
|
|
});
|
|
} catch (e) {
|
|
resolve({
|
|
status: res.statusCode,
|
|
headers: res.headers,
|
|
data: body
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
req.on('error', reject);
|
|
|
|
if (data) {
|
|
req.write(JSON.stringify(data));
|
|
}
|
|
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
async function debugEmployee403Errors() {
|
|
try {
|
|
console.log('1️⃣ Connexion avec compte employé...');
|
|
|
|
// Connexion employé
|
|
const loginResponse = await makeRequest('/api/login', 'POST', TEST_EMPLOYEE_CREDENTIALS);
|
|
|
|
if (loginResponse.status !== 200) {
|
|
console.error('❌ Échec de connexion employé');
|
|
console.error(` Status: ${loginResponse.status}`);
|
|
console.error(` Response: ${JSON.stringify(loginResponse.data, null, 2)}`);
|
|
return;
|
|
}
|
|
|
|
console.log('✅ Connexion employé réussie\n');
|
|
|
|
// Extraire les cookies de session
|
|
const setCookieHeaders = loginResponse.headers['set-cookie'] || [];
|
|
const cookies = setCookieHeaders.join('; ');
|
|
|
|
console.log('2️⃣ Test des routes susceptibles de générer des erreurs 403...\n');
|
|
|
|
const results = [];
|
|
|
|
// Tester chaque route
|
|
for (const route of ROUTES_TO_TEST) {
|
|
console.log(`🔍 Test: ${route.method} ${route.path} - ${route.description}`);
|
|
|
|
try {
|
|
const response = await makeRequest(route.path, route.method, route.data, cookies);
|
|
|
|
const status = response.status;
|
|
const statusIcon = status === 200 ? '✅' : status === 403 ? '❌' : '⚠️';
|
|
|
|
console.log(` ${statusIcon} Status: ${status}`);
|
|
|
|
if (status === 403) {
|
|
console.log(` 🚫 ERREUR 403: ${JSON.stringify(response.data, null, 2)}`);
|
|
results.push({ route, status, error: response.data, success: false });
|
|
} else if (status === 200) {
|
|
const dataSize = Array.isArray(response.data) ? response.data.length : 'N/A';
|
|
console.log(` 📊 Données retournées: ${dataSize} éléments`);
|
|
results.push({ route, status, success: true });
|
|
} else {
|
|
console.log(` ⚠️ Status inattendu: ${JSON.stringify(response.data, null, 2)}`);
|
|
results.push({ route, status, error: response.data, success: false });
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log(` 💥 Erreur réseau: ${error.message}`);
|
|
results.push({ route, status: 'ERROR', error: error.message, success: false });
|
|
}
|
|
|
|
console.log(''); // Ligne vide entre les tests
|
|
}
|
|
|
|
// Résumé des résultats
|
|
console.log('📊 === RÉSUMÉ DES TESTS ===');
|
|
console.log('==========================\n');
|
|
|
|
const successfulRoutes = results.filter(r => r.success);
|
|
const forbiddenRoutes = results.filter(r => r.status === 403);
|
|
const errorRoutes = results.filter(r => !r.success && r.status !== 403);
|
|
|
|
console.log(`✅ Routes accessibles: ${successfulRoutes.length}/${results.length}`);
|
|
console.log(`❌ Erreurs 403: ${forbiddenRoutes.length}/${results.length}`);
|
|
console.log(`⚠️ Autres erreurs: ${errorRoutes.length}/${results.length}\n`);
|
|
|
|
if (forbiddenRoutes.length > 0) {
|
|
console.log('🚫 ROUTES BLOQUÉES (403):');
|
|
forbiddenRoutes.forEach(result => {
|
|
console.log(` • ${result.route.method} ${result.route.path} - ${result.route.description}`);
|
|
console.log(` Erreur: ${result.error?.message || 'Permission refusée'}`);
|
|
});
|
|
console.log('');
|
|
}
|
|
|
|
if (errorRoutes.length > 0) {
|
|
console.log('⚠️ AUTRES ERREURS:');
|
|
errorRoutes.forEach(result => {
|
|
console.log(` • ${result.route.method} ${result.route.path} - Status: ${result.status}`);
|
|
console.log(` Erreur: ${result.error?.message || result.error}`);
|
|
});
|
|
console.log('');
|
|
}
|
|
|
|
console.log('💡 RECOMMANDATIONS:');
|
|
if (forbiddenRoutes.length === 0) {
|
|
console.log(' 🎉 Aucune erreur 403 détectée - les permissions semblent correctes !');
|
|
} else {
|
|
console.log(' 1. Vérifiez les permissions dans shared/permissions.ts');
|
|
console.log(' 2. Vérifiez les middlewares de permission dans server/permissions.ts');
|
|
console.log(' 3. Vérifiez l\'assignation de groupes/magasins à l\'employé');
|
|
console.log(' 4. Examinez les logs serveur pendant l\'exécution des requêtes');
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('💥 Erreur lors du débogage:', error.message);
|
|
}
|
|
}
|
|
|
|
// Instructions d'utilisation
|
|
console.log('📋 Instructions:');
|
|
console.log('1. Configurez les variables d\'environnement:');
|
|
console.log(' - PRODUCTION_URL=https://votre-serveur.com');
|
|
console.log(' - TEST_EMPLOYEE_USERNAME=nom_utilisateur_employe');
|
|
console.log(' - TEST_EMPLOYEE_PASSWORD=mot_de_passe');
|
|
console.log('2. Exécutez: node debug-employee-403-production.js\n');
|
|
|
|
// Exécuter le debug si le script est appelé directement
|
|
if (require.main === module) {
|
|
debugEmployee403Errors().catch(console.error);
|
|
}
|
|
|
|
module.exports = { debugEmployee403Errors }; |