source: spip-zone/_plugins_/verifier/verifier/email.php

Last change on this file was 109086, checked in by tcharlss@…, 8 months ago

PHPDoc

File size: 3.9 KB
Line 
1<?php
2/**
3 * API de vérification : vérification de la validité d'una adresse de courriel
4 *
5 * @plugin     verifier
6 * @copyright  2018
7 * @author     Les Développements Durables
8 * @licence    GNU/GPL
9 */
10
11// Sécurité
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Vérifie la validité d'une adresse de courriel.
18 *
19 * Les contraintes du mail sont déterminées par le mode de validation
20 * En option, on contrôle aussi la disponibilité du mail dans la table des auteurs
21 *
22 * @param string $valeur
23 *   La valeur à vérifier.
24 * @param array $options
25 *   Un éventuel tableau d'options.
26 * @return string
27 *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
28 */
29function verifier_email_dist($valeur, $options = array()) {
30        include_spip('inc/filtres');
31        if (!is_string($valeur)) {
32                return $erreur;
33        }
34
35        // Disponibilite des courriels en base AUTEURS
36        // Si l'adresse n'est pas disponible, on stoppe tout sinon on continue
37        if (!empty($options['disponible']) and !verifier_disponibilite_email($valeur, isset($options['id_auteur']) ? $options['id_auteur'] : null)) {
38                return _T('verifier:erreur_email_nondispo', array('email' => echapper_tags($valeur)));
39        }
40
41        // Choix du mode de verification de la syntaxe des courriels
42        if (empty($options['mode']) or !in_array($options['mode'], array('normal','rfc5322','strict'))) {
43                $mode = 'normal';
44        } else {
45                $mode = $options['mode'];
46        }
47
48        $fonctions_disponibles = array(
49                'normal'  => 'email_valide',
50                'rfc5322' => 'verifier_email_rfc5322',
51                'strict'  => 'verifier_email_de_maniere_stricte'
52        );
53        $fonction_verif = $fonctions_disponibles[$mode];
54
55        if (!$fonction_verif($valeur)) {
56                return _T('verifier:erreur_email', array('email' => echapper_tags($valeur)));
57        } else {
58                return '';
59        }
60}
61
62/**
63 * Changement de la RegExp d'origine
64 *
65 * Respect de la RFC5322
66 *
67 * @link (phraseur détaillé ici : http://www.dominicsayers.com/isemail/)
68 * @param string $valeur La valeur à vérifier
69 * @return boolean Retourne true uniquement lorsque le mail est valide
70 */
71function verifier_email_rfc5322($valeur) {
72        // Si c'est un spammeur autant arreter tout de suite
73        if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $valeur)) {
74                spip_log("Tentative d'injection de mail : $valeur");
75                return false;
76        }
77        include_spip('inc/is_email');
78        foreach (explode(',', $valeur) as $adresse) {
79                if (!is_email(trim($adresse))) {
80                        return false;
81                }
82        }
83        return true;
84}
85
86/**
87 * Version basique du contrôle des mails
88 *
89 * Cette version impose des restrictions supplémentaires
90 * qui sont souvent utilisées pour des raison de simplification des adresses
91 * (ex. comptes utilisateurs lisibles, etc..)
92 *
93 * @param string $valeur La valeur à vérifier
94 * @return boolean Retourne true uniquement lorsque le mail est valide
95 */
96function verifier_email_de_maniere_stricte($valeur) {
97        // Si c'est un spammeur autant arreter tout de suite
98        if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $valeur)) {
99                spip_log("Tentative d'injection de mail : $valeur");
100                return false;
101        }
102        foreach (explode(',', $valeur) as $adresse) {
103                // nettoyer certains formats
104                // "Marie Toto <Marie@toto.com>"
105                $adresse = trim(preg_replace(',^[^<>\"]*<([^<>\"]+)>$,i', '\\1', $adresse));
106                if (!preg_match('/^([A-Za-z0-9]){1}([A-Za-z0-9]|-|_|\.)*@[A-Za-z0-9]([A-Za-z0-9]|-|\.){1,}\.[A-Za-z]{2,4}$/', $adresse)) {
107                        return false;
108                }
109        }
110        return true;
111}
112
113/**
114 * Vérifier que le courriel à tester n'est pas
115 * déjà utilisé dans la table spip_auteurs
116 *
117 * @param string $valeur La valeur à vérifier
118 * @return boolean Retourne false lorsque le mail est déjà utilisé
119 */
120function verifier_disponibilite_email($valeur, $exclure_id_auteur = null) {
121        include_spip('base/abstract_sql');
122
123        if (sql_getfetsel('id_auteur', 'spip_auteurs', 'email='.sql_quote($valeur).(!is_null($exclure_id_auteur)?"AND statut<>'5poubelle' AND id_auteur<>".intval($exclure_id_auteur):''))) {
124                return false;
125        } else {
126                return true;
127        }
128}
Note: See TracBrowser for help on using the repository browser.