T.ME/BIBIL_0DAY
CasperSecurity


Server : Apache/2
System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User : gositeme ( 1004)
PHP Version : 8.2.29
Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Directory :  /home/gositeme/domains/lavocat.ca/public_html/scripts/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.ca/public_html/scripts/add-users-to-role-based-rooms.js
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

// Import the permission functions (simplified version for Node.js)
const ROOM_ACCESS_MATRIX = {
  'public': {
    'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'LAWYER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'SECRETARY': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'CLERK': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'ASSISTANT': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'USER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false }
  },
  'legal_support': {
    'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'LAWYER': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'SECRETARY': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'CLERK': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'ASSISTANT': { canJoin: true, canRead: true, canWrite: true, canManage: false, canDelete: false },
    'USER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false }
  },
  'admin': {
    'SUPERADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'ADMIN': { canJoin: true, canRead: true, canWrite: true, canManage: true, canDelete: true },
    'LAWYER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
    'SECRETARY': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
    'CLERK': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
    'ASSISTANT': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false },
    'USER': { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false }
  }
};

const ROOM_TYPE_MAPPING = {
  'public': [
    'Général', 'General', 'Announcements',
    'E.D. d\'Amos', 'E.D. de Rimouski', 'E.D. de Québec – F', 'E.D. de Québec – M',
    'E.D. de Baie-Comeau', 'E.D. de Sept-Îles', 'E.D. de Sherbrooke', 'E.D. de New Carlisle',
    'E.D. de Percé', 'E.D. de Havre-Aubert', 'E.D. de Hull', 'E.D. de Saint-Jérôme',
    'E.L. de Laval', 'E.D. de Trois-Rivières', 'E.D. de Sorel-Tracy', 'E.D. de Montréal (Bordeaux)',
    'E.D. de Rivière-des-Prairies', 'E.D. de Roberval', 'Bordeaux (Montréal)', 'Rivière-des-Prairies (Montréal)',
    'Leclerc (Laval)', 'Orsainville (Québec) - Hommes', 'Orsainville (Québec) - Femmes',
    'Baie-Comeau', 'Sept-Îles', 'Port-Cartier', 'Sherbrooke', 'Trois-Rivières', 'Saint-Jérôme',
    'Hull (Gatineau)', 'Roberval', 'Rimouski', 'Sorel-Tracy', 'Saint-Hyacinthe', 'Amos',
    'New Carlisle', 'Percé', 'Havre-Aubert (Îles-de-la-Madeleine)', 'Maison Tanguay (Femmes)',
    'Joliette (Femmes Fédéral)', 'Cité-des-Prairies (Jeunes)', 'Archambault (Fédéral)',
    'Cowansville (Fédéral)', 'Donnacona (Fédéral)', 'La Macaza (Fédéral)', 'Sainte-Anne-des-Plaines (Fédéral)',
    'Aide Juridique Générale', 'Transferts et Transport', 'Visites Familiales', 'Libération Conditionnelle',
    'Soins Médicaux', 'Support Communautaire', 'Réintégration Sociale'
  ],
  'legal_support': [
    'Legal Support'
  ],
  'admin': [
    'Admin', 'System', 'Moderation'
  ]
};

function getRoomAccessType(roomName) {
  const normalizedName = roomName.toLowerCase();
  
  for (const [accessType, roomNames] of Object.entries(ROOM_TYPE_MAPPING)) {
    if (roomNames.some(name => normalizedName.includes(name.toLowerCase()))) {
      return accessType;
    }
  }
  
  return 'public';
}

function getChatPermissions(userRole, roomName) {
  const accessType = getRoomAccessType(roomName);
  const rolePermissions = ROOM_ACCESS_MATRIX[accessType];
  
  if (!rolePermissions) {
    return ROOM_ACCESS_MATRIX.public[userRole] || 
           { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false };
  }
  
  return rolePermissions[userRole] || 
         { canJoin: false, canRead: false, canWrite: false, canManage: false, canDelete: false };
}

async function addUsersToRoleBasedRooms() {
  try {
    console.log('🔄 Adding users to role-based chat rooms...');
    
    // Get all users and rooms
    const [users, rooms] = await Promise.all([
      prisma.user.findMany({
        select: { id: true, name: true, email: true, role: true }
      }),
      prisma.chatRoom.findMany({
        select: { id: true, name: true }
      })
    ]);
    
    console.log(`Found ${users.length} users and ${rooms.length} rooms`);
    
    let totalAdded = 0;
    let totalSkipped = 0;
    
    for (const user of users) {
      console.log(`\n👤 Processing user: ${user.name} (${user.role})`);
      
      for (const room of rooms) {
        const permissions = getChatPermissions(user.role, room.name);
        
        if (permissions.canJoin) {
          // Check if user is already a participant
          const existingParticipant = await prisma.chatParticipant.findUnique({
            where: {
              userId_chatRoomId: {
                userId: user.id,
                chatRoomId: room.id
              }
            }
          });
          
          if (!existingParticipant) {
            // Add user to room
            await prisma.chatParticipant.create({
              data: {
                userId: user.id,
                chatRoomId: room.id,
                role: user.role === 'SUPERADMIN' || user.role === 'ADMIN' ? 'ADMIN' : 'MEMBER'
              }
            });
            
            console.log(`  ✅ Added to: ${room.name}`);
            totalAdded++;
          } else {
            console.log(`  ⏭️  Already in: ${room.name}`);
            totalSkipped++;
          }
        } else {
          console.log(`  ❌ No access to: ${room.name}`);
        }
      }
    }
    
    console.log(`\n🎉 Complete! Added ${totalAdded} participations, skipped ${totalSkipped} existing ones`);
    
    // Show summary by role
    console.log('\n📊 Summary by role:');
    const roleCounts = {};
    users.forEach(u => {
      roleCounts[u.role] = (roleCounts[u.role] || 0) + 1;
    });
    
    for (const [role, count] of Object.entries(roleCounts)) {
      console.log(`  ${role}: ${count} users`);
    }
    
  } catch (error) {
    console.error('❌ Error:', error);
  } finally {
    await prisma.$disconnect();
  }
}

addUsersToRoleBasedRooms(); 

CasperSecurity Mini