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