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/src/lib/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.ca/public_html/src/lib/case-permissions.ts
import { User } from '@prisma/client';

// Permission Levels
export enum PermissionLevel {
  NONE = 0,
  READ = 1,
  WRITE = 2,
  ADMIN = 3,
  OWNER = 4
}

// Resource Types
export enum ResourceType {
  CASE = 'case',
  DOCUMENT = 'document',
  UPDATE = 'update',
  ASSIGNMENT = 'assignment',
  OFFER = 'offer',
  REGISTRATION = 'registration'
}

// Case-specific permissions interface
export interface CasePermissions {
  // Ownership
  isOwner: boolean;
  isLeadLawyer: boolean;
  isAssigned: boolean;
  isClient: boolean;
  isCreator: boolean;
  
  // Actions
  canEdit: boolean;
  canDelete: boolean;
  canAssign: boolean;
  canUpdate: boolean;
  canCollaborate: boolean;
  canViewDocuments: boolean;
  canUploadDocuments: boolean;
  canCreateOffers: boolean;
  canAcceptOffers: boolean;
  canViewRegistrations: boolean;
  canApproveRegistrations: boolean;
  canCreateUpdates: boolean;
  canViewAnalytics: boolean;
  canManageTeam: boolean;
  canCloseCase: boolean;
  canReopenCase: boolean;
}

// Permission checker interface
export interface PermissionChecker {
  canCreate(user: User, resource: ResourceType): boolean;
  canRead(user: User, resource: ResourceType, resourceId?: string, context?: any): boolean;
  canUpdate(user: User, resource: ResourceType, resourceId: string, context?: any): boolean;
  canDelete(user: User, resource: ResourceType, resourceId: string, context?: any): boolean;
  canAssign(user: User, resource: ResourceType, resourceId: string, context?: any): boolean;
  canApprove(user: User, resource: ResourceType, resourceId: string, context?: any): boolean;
}

// Role permissions interface
interface RolePermissions {
  canCreateCases?: boolean;
  canReadOwnCases?: boolean;
  canReadAssignedCases?: boolean;
  canReadAllCases?: boolean;
  canReadPublicCases?: boolean;
  canReadCourtCases?: boolean;
  canUpdateOwnCases?: boolean;
  canUpdateAssignedCases?: boolean;
  canUpdateAllCases?: boolean;
  canUpdateCourtCases?: boolean;
  canUpdateExpertReports?: boolean;
  canUpdateSupportTasks?: boolean;
  canUpdateNotaryDocuments?: boolean;
  canUpdateCases?: boolean;
  canDeleteOwnCases?: boolean;
  canDeleteCases?: boolean;
  canAssignTeam?: boolean;
  canAssignAnyRole?: boolean;
  canAssignCourtStaff?: boolean;
  canAssignMediationTeam?: boolean;
  canAssignInvestigationTeam?: boolean;
  canAssignSupportTasks?: boolean;
  canApproveRegistrations?: boolean;
  canApproveCourtOrders?: boolean;
  canCollaborate?: boolean;
  canViewAllDocuments?: boolean;
  canUploadDocuments?: boolean;
  canCreateOffers?: boolean;
  canAcceptOffers?: boolean;
  canViewCaseAnalytics?: boolean;
  canViewOwnAnalytics?: boolean;
  canViewAllAnalytics?: boolean;
  canViewCourtAnalytics?: boolean;
  canViewMediationAnalytics?: boolean;
  canViewInvestigationAnalytics?: boolean;
  canViewExpertAnalytics?: boolean;
  canViewSupportAnalytics?: boolean;
  canViewLearningAnalytics?: boolean;
  canViewNotaryAnalytics?: boolean;
  canManageClientRelationships?: boolean;
  canManageSystem?: boolean;
  canOverridePermissions?: boolean;
  canImpersonateUsers?: boolean;
  canManageRoles?: boolean;
  canCreateCourtOrders?: boolean;
  canScheduleHearings?: boolean;
  canCreateSettlements?: boolean;
  canFacilitateCommunication?: boolean;
  canUploadEvidence?: boolean;
  canCreateReports?: boolean;
  canCreateExpertReports?: boolean;
  canUploadCredentials?: boolean;
  canProcessDocuments?: boolean;
  canObserveCases?: boolean;
  canAccessEducationalContent?: boolean;
  canNotarizeDocuments?: boolean;
  canCreateCertificates?: boolean;
  canApplyToCases?: boolean;
  canViewPublicCases?: boolean;
}

// Role definitions with permissions
export const ROLE_PERMISSIONS: Record<string, RolePermissions> = {
  CLIENT: {
    canCreateCases: true,
    canReadOwnCases: true,
    canUpdateOwnCases: true,
    canDeleteOwnCases: true,
    canApplyToCases: true,
    canViewPublicCases: true,
    canCollaborate: true,
    canUploadDocuments: true,
    canCreateOffers: true,
    canAcceptOffers: true,
    canViewOwnAnalytics: true,
  },
  LAWYER: {
    canCreateCases: true,
    canReadAssignedCases: true,
    canUpdateAssignedCases: true,
    canDeleteCases: false,
    canAssignTeam: true,
    canCollaborate: true,
    canViewAllDocuments: true,
    canUploadDocuments: true,
    canCreateOffers: true,
    canAcceptOffers: true,
    canViewCaseAnalytics: true,
    canManageClientRelationships: true,
  },
  ADMIN: {
    canCreateCases: true,
    canReadAllCases: true,
    canUpdateAllCases: true,
    canDeleteCases: true,
    canAssignAnyRole: true,
    canApproveRegistrations: true,
    canViewAllAnalytics: true,
    canManageSystem: true,
    canOverridePermissions: true,
  },
  SUPERADMIN: {
    canCreateCases: true,
    canReadAllCases: true,
    canUpdateAllCases: true,
    canDeleteCases: true,
    canAssignAnyRole: true,
    canApproveRegistrations: true,
    canViewAllAnalytics: true,
    canManageSystem: true,
    canOverridePermissions: true,
    canImpersonateUsers: true,
    canManageRoles: true,
  },
  JUDGE: {
    canCreateCases: false,
    canReadCourtCases: true,
    canUpdateCourtCases: true,
    canDeleteCases: false,
    canAssignCourtStaff: true,
    canApproveCourtOrders: true,
    canViewCourtAnalytics: true,
    canCreateCourtOrders: true,
    canScheduleHearings: true,
  },
  MEDIATOR: {
    canCreateCases: false,
    canReadAssignedCases: true,
    canUpdateAssignedCases: true,
    canDeleteCases: false,
    canAssignMediationTeam: true,
    canCreateSettlements: true,
    canViewMediationAnalytics: true,
    canFacilitateCommunication: true,
  },
  INVESTIGATOR: {
    canCreateCases: false,
    canReadAssignedCases: true,
    canUpdateAssignedCases: true,
    canDeleteCases: false,
    canAssignInvestigationTeam: true,
    canUploadEvidence: true,
    canCreateReports: true,
    canViewInvestigationAnalytics: true,
  },
  EXPERT_WITNESS: {
    canCreateCases: false,
    canReadAssignedCases: true,
    canUpdateExpertReports: true,
    canDeleteCases: false,
    canCreateExpertReports: true,
    canUploadCredentials: true,
    canViewExpertAnalytics: true,
  },
  SUPPORT_STAFF: {
    canCreateCases: false,
    canReadAssignedCases: true,
    canUpdateSupportTasks: true,
    canDeleteCases: false,
    canAssignSupportTasks: true,
    canProcessDocuments: true,
    canViewSupportAnalytics: true,
  },
  STUDENT: {
    canCreateCases: false,
    canReadPublicCases: true,
    canUpdateCases: false,
    canDeleteCases: false,
    canObserveCases: true,
    canViewLearningAnalytics: true,
    canAccessEducationalContent: true,
  },
  NOTARY: {
    canCreateCases: false,
    canReadAssignedCases: true,
    canUpdateNotaryDocuments: true,
    canDeleteCases: false,
    canNotarizeDocuments: true,
    canViewNotaryAnalytics: true,
    canCreateCertificates: true,
  },
};

// Case permission checker
export class CasePermissionChecker implements PermissionChecker {
  
  canCreate(user: User, resource: ResourceType): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    return rolePermissions?.canCreateCases || false;
  }

  canRead(user: User, resource: ResourceType, resourceId?: string, context?: any): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    
    // Super admin and admin can read all cases
    if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
      return rolePermissions?.canReadAllCases || false;
    }
    
    // Other roles have specific read permissions
    return rolePermissions?.canReadAssignedCases || 
           rolePermissions?.canReadOwnCases || 
           rolePermissions?.canReadPublicCases || 
           rolePermissions?.canReadCourtCases || false;
  }

  canUpdate(user: User, resource: ResourceType, resourceId: string, context?: any): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    
    // Super admin and admin can update all cases
    if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
      return rolePermissions?.canUpdateAllCases || false;
    }
    
    // Check if user is owner/creator of the case
    if (context?.case?.createdBy === user.id) {
      return true;
    }
    
    // Check if user is lead lawyer
    if (context?.case?.leadLawyerId === user.id) {
      return rolePermissions?.canUpdateAssignedCases || false;
    }
    
    // Check if user is assigned to the case
    if (context?.case?.primaryLawyerId === user.id || 
        context?.case?.assistantLawyerId === user.id || 
        context?.case?.secretaryId === user.id) {
      return rolePermissions?.canUpdateAssignedCases || false;
    }
    
    return false;
  }

  canDelete(user: User, resource: ResourceType, resourceId: string, context?: any): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    
    // Only super admin and admin can delete cases
    if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
      return rolePermissions?.canDeleteCases || false;
    }
    
    // Check if user is owner/creator (for clients)
    if (user.role === 'CLIENT' && context?.case?.createdBy === user.id) {
      return rolePermissions?.canDeleteOwnCases || false;
    }
    
    return false;
  }

  canAssign(user: User, resource: ResourceType, resourceId: string, context?: any): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    
    // Super admin and admin can assign any role
    if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
      return rolePermissions?.canAssignAnyRole || false;
    }
    
    // Lead lawyers can assign team members
    if (context?.case?.leadLawyerId === user.id) {
      return rolePermissions?.canAssignTeam || false;
    }
    
    // Role-specific assignment permissions
    return rolePermissions?.canAssignCourtStaff || 
           rolePermissions?.canAssignMediationTeam || 
           rolePermissions?.canAssignInvestigationTeam || 
           rolePermissions?.canAssignSupportTasks || false;
  }

  canApprove(user: User, resource: ResourceType, resourceId: string, context?: any): boolean {
    if (resource !== ResourceType.CASE) return false;
    
    const rolePermissions = ROLE_PERMISSIONS[user.role as keyof typeof ROLE_PERMISSIONS];
    
    // Super admin and admin can approve anything
    if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
      return rolePermissions?.canApproveRegistrations || false;
    }
    
    // Role-specific approval permissions
    return rolePermissions?.canApproveCourtOrders || 
           rolePermissions?.canApproveRegistrations || false;
  }
}

// Get case-specific permissions for a user
export function getCasePermissions(user: User, caseData: any): CasePermissions {
  const isOwner = caseData?.createdBy === user.id;
  const isLeadLawyer = caseData?.leadLawyerId === user.id;
  const isAssigned = caseData?.primaryLawyerId === user.id || 
                     caseData?.assistantLawyerId === user.id || 
                     caseData?.secretaryId === user.id;
  const isClient = caseData?.clientId === user.id;
  const isCreator = caseData?.createdBy === user.id;
  
  const rolePermissions = ROLE_PERMISSIONS[user.role] || {};
  
  return {
    isOwner,
    isLeadLawyer,
    isAssigned,
    isClient,
    isCreator,
    
    // Basic actions
    canEdit: ['SUPERADMIN', 'ADMIN'].includes(user.role) || 
             (isOwner && rolePermissions.canUpdateOwnCases === true) ||
             (isLeadLawyer && rolePermissions.canUpdateAssignedCases === true) ||
             (isAssigned && rolePermissions.canUpdateAssignedCases === true),
    
    canDelete: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
               (isOwner && rolePermissions.canDeleteOwnCases === true),
    
    canAssign: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
               (isLeadLawyer && rolePermissions.canAssignTeam === true) ||
               rolePermissions.canAssignAnyRole === true ||
               rolePermissions.canAssignCourtStaff === true ||
               rolePermissions.canAssignMediationTeam === true ||
               rolePermissions.canAssignInvestigationTeam === true ||
               rolePermissions.canAssignSupportTasks === true,
    
    canUpdate: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
               (isOwner && rolePermissions.canUpdateOwnCases === true) ||
               (isLeadLawyer && rolePermissions.canUpdateAssignedCases === true) ||
               (isAssigned && rolePermissions.canUpdateAssignedCases === true),
    
    canCollaborate: rolePermissions.canCollaborate === true,
    
    canViewDocuments: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                      rolePermissions.canViewAllDocuments === true ||
                      isOwner || isLeadLawyer || isAssigned || isClient,
    
    canUploadDocuments: rolePermissions.canUploadDocuments === true,
    
    canCreateOffers: rolePermissions.canCreateOffers === true,
    
    canAcceptOffers: rolePermissions.canAcceptOffers === true,
    
    canViewRegistrations: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                          isLeadLawyer || isAssigned,
    
    canApproveRegistrations: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                             rolePermissions.canApproveRegistrations === true,
    
    canCreateUpdates: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                      isLeadLawyer || isAssigned || isOwner,
    
    canViewAnalytics: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                      rolePermissions.canViewAllAnalytics === true ||
                      rolePermissions.canViewCaseAnalytics === true ||
                      rolePermissions.canViewOwnAnalytics === true ||
                      rolePermissions.canViewCourtAnalytics === true ||
                      rolePermissions.canViewMediationAnalytics === true ||
                      rolePermissions.canViewInvestigationAnalytics === true ||
                      rolePermissions.canViewExpertAnalytics === true ||
                      rolePermissions.canViewSupportAnalytics === true ||
                      rolePermissions.canViewLearningAnalytics === true ||
                      rolePermissions.canViewNotaryAnalytics === true,
    
    canManageTeam: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                   (isLeadLawyer && rolePermissions.canAssignTeam === true),
    
    canCloseCase: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                  isLeadLawyer,
    
    canReopenCase: ['SUPERADMIN', 'ADMIN'].includes(user.role) ||
                   isLeadLawyer,
  };
}

// Check if user can access a specific case
export function canAccessCase(user: User, caseData: any): boolean {
  if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
    return true; // Can access all cases
  }
  
  // Check ownership
  if (caseData?.createdBy === user.id || caseData?.clientId === user.id) {
    return true;
  }
  
  // Check assignment
  if (caseData?.leadLawyerId === user.id || 
      caseData?.primaryLawyerId === user.id || 
      caseData?.assistantLawyerId === user.id || 
      caseData?.secretaryId === user.id) {
    return true;
  }
  
  // Check public access
  if (caseData?.isPublic && user.role === 'STUDENT') {
    return true;
  }
  
  return false;
}

// Get filtered cases based on user role
export function getCaseFilterForUser(user: User): any {
  if (['SUPERADMIN', 'ADMIN'].includes(user.role)) {
    return {}; // Can see all cases
  }
  
  const filter: any = {};
  
  switch (user.role) {
    case 'CLIENT':
      filter.OR = [
        { createdBy: user.id },
        { clientId: user.id },
        { isPublic: true }
      ];
      break;
      
    case 'LAWYER':
      filter.OR = [
        { leadLawyerId: user.id },
        { primaryLawyerId: user.id },
        { assistantLawyerId: user.id },
        { secretaryId: user.id }
      ];
      break;
      
    case 'JUDGE':
      filter.jurisdiction = 'Quebec'; // Default jurisdiction for judges
      break;
      
    case 'MEDIATOR':
    case 'INVESTIGATOR':
    case 'EXPERT_WITNESS':
    case 'SUPPORT_STAFF':
    case 'NOTARY':
      filter.OR = [
        { leadLawyerId: user.id },
        { primaryLawyerId: user.id },
        { assistantLawyerId: user.id },
        { secretaryId: user.id }
      ];
      break;
      
    case 'STUDENT':
      filter.isPublic = true;
      break;
      
    default:
      filter.createdBy = user.id; // Default to own cases
  }
  
  return filter;
} 

CasperSecurity Mini