Skip to content

fix: l'import pcap échoue avec des espaces ou caractères spéciaux dans le chemin#99

Open
apanchoo wants to merge 3 commits into
Sonar-team:mainfrom
apanchoo:fix/pcap-special-chars-88
Open

fix: l'import pcap échoue avec des espaces ou caractères spéciaux dans le chemin#99
apanchoo wants to merge 3 commits into
Sonar-team:mainfrom
apanchoo:fix/pcap-special-chars-88

Conversation

@apanchoo

Copy link
Copy Markdown

Fixes #88

Problème

Capture::from_file appelle .to_str() sur le chemin, qui retourne None pour les chemins non-UTF-8. Dans ce cas, new_raw passe NULL à pcap_open_offline, qui lit stdin au lieu du fichier.

Même pour les chemins UTF-8 valides, pcap_open_offline (fonction C) peut mal gérer les chemins contenant des espaces ou des caractères spéciaux selon la locale système.

Correction

Ajout d'une fonction open_capture qui :

  1. Ouvre le fichier avec std::fs::File::open — la gestion native des chemins par Rust fonctionne correctement pour tous les chemins valides (espaces, accents, #, (), etc.)
  2. Passe le descripteur de fichier à Capture::from_raw_fd qui utilise pcap_fopen_offline(FILE*) au lieu de pcap_open_offline(path), contournant tout problème d'encodage dans libpcap

Test

Testé avec un fichier nommé mon capture (été) #2.pcap — l'import fonctionne correctement.

…ar-team#88)

Replace Capture::from_file with File::open + Capture::from_raw_fd so
that libpcap receives a FILE* instead of a raw path string, bypassing
encoding issues in pcap_open_offline for paths containing spaces,
accents or special characters.
@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Cette pull request corrige un bug critique qui empêchait l'importation de fichiers PCAP lorsque leurs chemins contenaient des espaces ou des caractères spéciaux. La solution refactorise le mécanisme d'ouverture de fichier en tirant parti de la gestion native des chemins de Rust et de l'ouverture basée sur les descripteurs de fichier de libpcap, garantissant ainsi une importation fiable des PCAP quelle que soit la complexité du chemin.

Highlights

  • Correction de l'importation de fichiers PCAP: Le problème où l'importation de fichiers PCAP échouait lorsque les chemins contenaient des espaces ou des caractères spéciaux, ou n'étaient pas UTF-8, a été résolu. Auparavant, Capture::from_file pouvait retourner None ou pcap_open_offline pouvait mal gérer ces chemins.
  • Nouvelle fonction open_capture: Une nouvelle fonction open_capture a été introduite. Elle utilise std::fs::File::open pour une gestion robuste des chemins par Rust, puis passe le descripteur de fichier à pcap::Capture::from_raw_fd. Cette approche contourne les problèmes d'encodage de chemin de libpcap.
  • Mise à jour des fonctions d'importation: Les fonctions count_packets_in_pcap et handle_pcap_file ont été modifiées pour utiliser la nouvelle fonction open_capture, assurant ainsi une gestion cohérente et fiable de l'ouverture des fichiers PCAP.
  • Mise à jour du .gitignore: Le fichier .gitignore a été mis à jour pour inclure de nouveaux fichiers liés à Nix (shell.nix) et des outils de développement (gen_pcap.py, test.pcap).

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • .gitignore
    • Ajout d'entrées pour les fichiers liés à Nix (shell.nix) et les outils de développement (gen_pcap.py, test.pcap).
  • src-tauri/src/commandes/import/mod.rs
    • Importations ajoutées pour std::fs::File et std::os::unix::io::IntoRawFd.
    • Fonction open_capture ajoutée pour gérer l'ouverture des fichiers PCAP de manière robuste.
    • Les appels à Capture::from_file ont été remplacés par open_capture dans count_packets_in_pcap et handle_pcap_file.
Activity
  • Aucune activité enregistrée pour cette pull request.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Ce pull request corrige un problème d'importation de fichiers pcap dont le chemin contient des espaces ou des caractères spéciaux. La solution proposée, qui consiste à ouvrir le fichier avec Rust puis à passer le descripteur de fichier à pcap, est bonne pour les systèmes de type Unix. Cependant, elle introduit une dépendance spécifique à Unix qui empêchera le code de compiler sur d'autres plateformes comme Windows. Mes commentaires suggèrent d'utiliser la compilation conditionnelle pour maintenir la compatibilité multiplateforme tout en appliquant le correctif pour Unix.

use packet_parser::PacketFlow;
use pcap::Capture;
use std::fs::File;
use std::os::unix::io::IntoRawFd;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

L'utilisation de std::os::unix::io::IntoRawFd rend ce code spécifique à Unix et ne compilera pas sur d'autres plateformes comme Windows. Pour maintenir la compatibilité multiplateforme, qui semble être un objectif du projet (présence de .exe dans .gitignore), il est préférable d'utiliser la compilation conditionnelle.

Suggested change
use std::os::unix::io::IntoRawFd;
#[cfg(unix)]
use std::os::unix::io::IntoRawFd;

Comment on lines +18 to +33
fn open_capture(file_path: &str) -> Result<Capture<pcap::Offline>, CaptureStateError> {
let file = File::open(file_path).map_err(|e| {
CaptureStateError::Import(PcapImportError::OpenFileError(
file_path.to_string(),
e.to_string(),
))
})?;
let fd = file.into_raw_fd();
// SAFETY: fd est valide et nous en sommes propriétaires
unsafe { Capture::from_raw_fd(fd) }.map_err(|e| {
CaptureStateError::Import(PcapImportError::OpenFileError(
file_path.to_string(),
e.to_string(),
))
})
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Cette implémentation de open_capture est spécifique à Unix à cause de into_raw_fd et from_raw_fd. Cela va causer des erreurs de compilation sur Windows. Je suggère d'utiliser la compilation conditionnelle pour fournir une implémentation pour les systèmes Unix et de conserver l'ancienne méthode pour les autres systèmes (comme Windows). Cela permettra à l'application de continuer à compiler sur toutes les plateformes, même si le bug des chemins d'accès persiste sous Windows en attendant une solution dédiée.

fn open_capture(file_path: &str) -> Result<Capture<pcap::Offline>, CaptureStateError> {
    #[cfg(unix)]
    {
        let file = File::open(file_path).map_err(|e| {
            CaptureStateError::Import(PcapImportError::OpenFileError(
                file_path.to_string(),
                e.to_string(),
            ))
        })?;
        let fd = file.into_raw_fd();
        // SAFETY: fd est valide et nous en sommes propriétaires. `from_raw_fd` en prend possession.
        unsafe { Capture::from_raw_fd(fd) }.map_err(|e| {
            CaptureStateError::Import(PcapImportError::OpenFileError(
                file_path.to_string(),
                e.to_string(),
            ))
        })
    }
    #[cfg(not(unix))]
    {
        // Conserve l'ancienne implémentation pour les plateformes non-Unix.
        // Le bug des chemins existera toujours sur Windows, mais le code compilera.
        Capture::from_file(file_path).map_err(|e| {
            CaptureStateError::Import(PcapImportError::OpenFileError(
                file_path.to_string(),
                e.to_string(),
            ))
        })
    }
}

Sur Windows, pcap_open_offline utilise l'API narrow string (ANSI) qui
ne supporte pas les caractères spéciaux/accentués. On utilise
GetShortPathNameW pour obtenir le chemin court 8.3 (ASCII) avant de
le passer à libpcap.
@Akmot9 Akmot9 added the enhancement Amélioration label Mar 23, 2026
@Akmot9 Akmot9 added this to SONAR Mar 23, 2026
@Akmot9 Akmot9 added this to the V1 milestone Mar 23, 2026
@Akmot9 Akmot9 moved this to En cours in SONAR Apr 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement Amélioration

Projects

Status: En cours

Development

Successfully merging this pull request may close these issues.

[BUG] Import de PCAP échoue avec caractères spéciaux

2 participants