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