IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Compréhension d'un code


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Compréhension d'un code
    Bonjour,

    on me demande d'apporter quelques modifications à un code mais j'ai un soucis pour savoir de quel format de mail il s'agit dans l'analyse de ce code.
    Si vous pouviez m'indiquer cela, ça m'aiderait beaucoup.
    Voici quelques bouts de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #--8<--------------------------------------------------------------------------#
    #
    #                        RECUPERATION DU FICHIER MIME
    #
    #-------------------------------------------------------------------------->8--#
     
    my $path_to_delete = "";
    my $temp_path = "$PATH_VAR_TMP/mms_parser-" . int(rand(999999999));
    system("/bin/rm -rf $temp_path");
    mkdir($temp_path) or log_msg('alert', "Couldn't create $temp_path") and exit(75);
    $path_to_delete = $temp_path;
     
    my $parser = MIME::Parser->new;
    $parser->output_under($temp_path);
    $parser->ignore_errors(1);
     
    # Réception de l'entrée standard
    my $is_quoted_printable = 0;
    my $concat = 0;
    my $fh;
    my $str;
    {
        while (<STDIN>) {
    	if ($concat) {
    	    $str .= $_;
    	} else {
    	    $str = $_;
    	}
    	if ($is_quoted_printable) {
    	    if ($str =~ /\x3d\x0d\x0a/) {
    		$str =~ s/\x3d\x0d\x0a//;
    		$concat = 1;
    	    } else {
    		$concat = 0;
    	    }
    	}
    	if ($str =~ /Content-Transfer-Encoding/) {
    	    if ($str =~ /quoted-printable/) {
    		$is_quoted_printable = 1;
    	    } else {
    		$is_quoted_printable = 0;
    	    }
    	}
     
    	if ($is_quoted_printable) {
    	    $str =~ s/\=($PROHIBITED_ENCODING)//g;
    	    $str =~ s/&#\d{5};//g;
    	}
     
    	if (!$concat) {
    	    $fh .= $str;
    	    $str = "";
    	}
        }
        $fh .= $str if (length($str));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #--8<--------------------------------------------------------------------------#
    #
    #                           PARSING DU FICHIER MIME
    #
    #-------------------------------------------------------------------------->8--#
    my $entity = eval { $parser->parse_data($fh) };
    $error = ($@ || $parser->last_error);
     
    # Traitement d'erreur BASIQUE. Il faut examiner les types d'erreurs
    # lors des tests, et vérifier si l'on ne peut pas passer outre.
    if (length($error)) {
        my $path = "$PATH_VAR_MMS/trash/" . time() . '-err-' .
    	sprintf("%.f", rand(1000000)) . "$EMAIL_EXT";
        if (open(ERR, ">$path")) {
    	print(ERR $fh);
    	log_msg('err', "MIME parsing failed. File saved to $path.\n$error");
    	exit(0) ;
        }
        log_msg('err', "$@ $!");
        exit(0); # syslogging wanted here ...
    }
    $error = 0;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # ----
    # parse_header      :
    # Paramètres        : Un en-tête MIME.
    # ----
    sub parse_header {
        my $header = shift;
     
        # Cette regexp est tres dependante du format de MessageID (infra amont)
        # effectuer un eval de
        # $split_id = "(split(/\./, $header->get('message-id')))[0,1]" ?
        my ($ext_id, $id) = (split(/\./, $header->get('message-id')))[0,1];
     
        unless (defined($id) || defined($ext_id)) {
    	log_msg('err', "ID or EXT-ID invalid. Exiting.");
    	dump_bad_mail($fh, time() . "-ID");
    	exit(0);
        }
        $ext_id = $1 if ($ext_id =~ /\D*(\d+)\D*/);
        $id = $1 if ($id =~ /\D*(\d+)\D*/);
     
        # get MSISDN
        my $from = $header->get('from');
        unless(defined($from)) {
    	log_msg('err', "No 'From' field available ! Exiting.");
    	dump_bad_mail($fh, time() . "-$id");
    	exit(0);
        }
        [...]
    }
    Merci

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    En tout cas, ces extraits de code me rappellent pourquoi je m'efforce de mettre au moins 25% de lignes de commentaires dans mes programmes(*) : quel merdier !
    Bon, apparemment c'est du MIME, mais quelle version ? Aucune idée. J'ai de sérieuses réserves sur le sérieux des personnes qui t'ont confié cette tâche sans te donner les spécifications nécessaires. Enfin bon, entre ce qu'il faudrait et ce qui arrive...

    Pour dévier légèrement du sujet, une chose dont je suis à peu près sûr, c'est qu'il y a des trucs bizarres dans ce code. Mais vraiment bizarres.
    L'idée, par exemple, de donner un nom aléatoire au répertoire provisoire est... pour le moins originale. Si c'est pour éviter des collisions dans un contexte de ressources partagées (seule explication que j'ai pu trouver), on peut trouver plus fiable, et plus simple (heure système, uid, pid, voire un mix). Il y a vraiment des gens qui adorent se compliquer la vie.
    Et je suis presque sûr que la grosse boucle du premier extrait pourrait être grandement simplifiée avec quelques perlismes bien placés (peut-être l'opérateur ".."). Évidemment, éviter des complications genre $fh .= $str if (length($str)); ce serait pas mal non plus. En tout cas l'avantage par rapport à $fh .= $str; m'échappe totalement. Et puis des broutilles qui me font toujours autant rire, comme ce \= qu'on peut voir dans une expression régulière.
    Tiens, un détail que j'ai pioché dans une RFC et dans l'aricle de Wikipedia, c'est que certaines valeurs comme "quoted-printable" sont insensibles à la casse, ce qui veut dire que certaines regex sans l'option i qu'on voit ça et là sont potentiellement sources d'erreurs, dans l'absolu.

    Enfin bref. Je te souhaite bien du courage, maxlegrand, sincèrement.

    (*) Je sais, c'est toujours ce qu'on dit, mais j'ai eu l'illumination quand j'ai voulu utiliser un module à la documentation incomplète (Net::IRC, pour info) et que j'ai réussi à trouver les fonctionnalités que je cherchais grâce aux commentaires du source. Depuis, j'essaie de me tenir à cette résolution. Les commentaires, c'est le Bien.
    There's nothing like $HOME!

Discussions similaires

  1. Compréhension d'un code JS
    Par InfoNewbie dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/05/2009, 18h46
  2. [XL-2007] Compréhension d'un code de filtre de colonne
    Par Fouinette85 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/04/2009, 18h00
  3. compréhension d'un code
    Par alsimbad dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/05/2008, 06h52
  4. [ARM7] Aide pour la compréhension d'un code
    Par hack-77 dans le forum Autres architectures
    Réponses: 6
    Dernier message: 25/03/2008, 20h34
  5. Réponses: 10
    Dernier message: 11/04/2007, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo