Skip to content
Extraits de code Groupes Projets
Valider 07aa9c90 rédigé par marcimat's avatar marcimat Validation de marcimat
Parcourir les fichiers

remove: Tests legacy/ et leur wrapper phpUnit. Use only phpunit tests

parent 8dadc34d
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<?php
declare(strict_types=1);
/***************************************************************************\
* SPIP, Système de publication pour l'internet *
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
namespace Spip\Test;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
/**
* LegacyUnitHtmlTest test - runs all the unit/ php tests and check the ouput is 'OK'
*/
#[Group('legacy')]
class LegacyUnitHtmlTest extends TestCase
{
#[DataProvider('providerLegacyHtmlfileName')]
public function testLegacyUnitHtml($inFname, $output) {
$result = $this->legacyHtmlRun($inFname);
$this->assertEquals($output, $result);
}
public static function providerLegacyHtmlfileName() {
require_once(__DIR__ . '/legacy/test.inc');
$liste_fichiers = tests_legacy_lister('html');
$tests = [];
foreach ($liste_fichiers as $k => $fichier) {
$tests[$k] = [$fichier, 'OK'];
}
return $tests;
}
protected function legacyHtmlRun($inFname) {
chdir(_SPIP_TEST_INC);
if (!is_file('../' . $inFname)) {
$this->fail(
"{$inFname} is missing" . json_encode([getcwd(), _SPIP_TEST_INC, _SPIP_TEST_CHDIR], JSON_THROW_ON_ERROR)
);
}
$output = [];
$returnCode = 0;
$realPath = realpath('tests/legacy/squel.php');
$php = PHP_BINARY;
exec("{$php} \"{$realPath}\" test={$inFname} mode=test_general var_mode=recalcul", $output, $returnCode);
if ($returnCode) {
array_unshift($output, 'ReturnCode: ' . $returnCode);
}
$result = rtrim(implode("\n", $output));
if (str_starts_with($result, 'NA')) {
$this->markTestSkipped($result);
} elseif (preg_match('#^OK \(?\d+\)?$#', $result)) {
$result = 'OK';
}
return $result;
}
}
<?php
declare(strict_types=1);
/***************************************************************************\
* SPIP, Système de publication pour l'internet *
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
namespace Spip\Test;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
/**
* LegacyUnitPhpTest test - runs all the unit/ php tests and check the ouput is 'OK'
*/
#[Group('legacy')]
#[Group('legacy-php')]
class LegacyUnitPhpTest extends TestCase
{
#[DataProvider('providerLegacyPhpfileName')]
public function testLegacyUnitPHP($inFname, $output) {
$result = $this->legacyPhpRun($inFname);
if ($result === $output) {
$this->assertEquals($output, $result, $result);
} else {
$this->fail($result);
}
}
public static function providerLegacyPhpfileName() {
require_once(__DIR__ . '/legacy/test.inc');
$liste_fichiers = tests_legacy_lister('php');
$liste_fichiers = array_filter($liste_fichiers, fn ($f) => str_contains(file_get_contents($f), 'test.inc'));
$tests = [];
foreach ($liste_fichiers as $k => $fichier) {
$tests[$k] = [$fichier, 'OK'];
}
return $tests;
}
protected function legacyPhpRun($inFname) {
chdir(_SPIP_TEST_INC);
if (!is_file('../' . $inFname) || !$realPath = realpath('../' . $inFname)) {
$this->fail(
"{$inFname} is missing" . json_encode([getcwd(), _SPIP_TEST_INC, _SPIP_TEST_CHDIR], JSON_THROW_ON_ERROR)
);
}
$output = [];
$returnCode = 0;
chdir(__DIR__ . '/legacy');
$php = PHP_BINARY;
exec("{$php} \"{$realPath}\" mode=test_general", $output, $returnCode);
if ($returnCode) {
array_unshift($output, 'ReturnCode: ' . $returnCode);
}
$result = rtrim(implode("\n", $output));
if (str_starts_with($result, 'NA')) {
$this->markTestSkipped($result);
} elseif (preg_match('#^OK \(?\d+\)?$#', $result)) {
$result = 'OK';
}
return $result;
}
}
body {
font-family: Lucida,Verdana,sans-serif;
background-color: #eeeeee;
font-size:small;
}
h1 {
background-color:#0066BB;
color:white;
font-size:large;
padding:15px;
}
h1 a {
color:white;
}
dt {
background-color: #aaa;
color: white;
padding: 4px;
font-size:medium;
}
dt a {
color:white;
}
dd, dd a {
line-height: 1.25em;
background-color: white;
color: #333;
text-decoration: none;
}
dd.ok, dd.ok a {
color: green;
}
dd.na, dd.na a {
color: orange;
}
dd.erreur, dd.erreur a {
color: red;
}
dl.ok dt {
background-color: green;
}
dl.erreur dt {
background-color: orange;
}
div.result {
background-color: white;
color: black;
font-size: small;
border: dotted 1px;
padding: 2px;
}
#count {
padding: 3px;
border: dotted 1px;
background-color: white;
float:right;
text-align:right;
position: absolute; top:4px; right:4px;
}
Ce diff est replié.
$(function(){
var delay = 100;
$("dt").click(function(){
$(this).siblings('dd').toggle();
});
$('dd').addClass('todo');
var doing = false;
var i=0;
var p = setInterval(function() {
if (doing)
return;
i++;
doing = true;
var start = new Date;
var me = $("dd.todo:first");
if (!me.length) {
clearInterval(p);
return;
}
me.find('a.joli')
.click(function() {
$(this).siblings('div.result').toggle();
return false;
})
.end()
.prepend('<a href="' + $('a',me).attr('href') + '" target="_result'+i+'">&#10144;</a>&nbsp;')
.append('<span>...</span>')
$('<div class="result">...</div>')
.hide()
.appendTo(me)
.load(
$("a", me).attr('href'),
function(e){
$(this).parent().removeClass('todo');
if (e.match(/^\s*OK/)) {
$(this).prev().html(e).parent().addClass('ok');
if ($(this).parent().siblings('dd:not(.ok):not(.na)').length == 0)
$(this).parent().parent().addClass('ok');
$('#succes').html(parseInt($('#succes').text())+1);
} else if (e.match(/^\s*NA/)) {
$(this).prev().html(e).parent().addClass('na');
if ($(this).parent().siblings('dd:not(.ok):not(.na)').length == 0)
$(this).parent().parent().addClass('ok');
} else {
$(this).prev().html('erreur').parent().addClass('erreur');
$(this).parent().parent().addClass('erreur');
$('#echec').html(parseInt($('#echec').text())+1);
}
$('#total').html(parseInt($('#total').text())+1);
$('#timer').html(parseInt($('#timer').text()) + (new Date - start));
doing = false;
}
);
}, delay);
});
<?php
declare(strict_types=1);
$remonte = __DIR__ . '/';
while (!is_file($remonte . 'test.inc')) {
$remonte .= '../';
}
require $remonte . 'test.inc';
// calcule un test a partir d'un squelette
$fond = preg_replace('#\.html$#', '', $_GET['test']);
$debug = (_request('var_mode') === 'debug');
define('_INTERDIRE_COMPRESSION_HTML', true);
$flag_preserver = true;
tests_init_dossier_squelettes();
$contenu = recuperer_fond($fond);
//include 'spip.php';
//$contenu = ob_get_contents();
//ob_end_clean();
$page = preg_replace('#^filtre:\s*.*\n?#im', '', $contenu);
// filtres a appliquer
if (preg_match_all('#^filtre:\s*(\w+)#im', $contenu, $r, PREG_SET_ORDER)) {
foreach ($r as $filtre) {
$page = $filtre[1]($page);
}
}
$page = trim($page);
echo $page;
// Tester si on est admin et il y a des choses supplementaires a dire
// type tableau pour y mettre des choses au besoin.
$debug = ($debug || isset($tableau_des_temps) && $tableau_des_temps) ? [1] : [];
if ($debug) {
$var_mode_affiche = _request('var_mode_affiche');
$var_mode_objet = _request('var_mode_objet');
$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche === 'validation' ? $page['texte'] : '');
echo erreur_squelette(false);
}
<?php
/*
* Ce fichier s'appelle depuis un test.php
* qui doit definir auparavant $test, et faire
* ensuite ses tests.
*
* Si tout est ok, le test doit afficher 'OK' et sortir
* Sinon du debug ou toute indication de la nature de l'échec...
*
*/
// let's go spip
if (!defined('_SPIP_TEST_INC')) {
define('_SPIP_TEST_INC', dirname(dirname(dirname(__FILE__))));
}
if (!defined('_SPIP_TEST_CHDIR')){
// si rien defini on va dans le public
define('_SPIP_TEST_CHDIR', dirname(_SPIP_TEST_INC));
}
chdir(_SPIP_TEST_CHDIR);
if (!defined('_DIR_TESTS')){
define('_DIR_TESTS', substr(_SPIP_TEST_INC, strlen(_SPIP_TEST_CHDIR)+1) . '/');
}
// pas de _VAR_MODE=recalcul par defaut, ca masque les eventuels problemes de cache
// cf
#if (!defined('_VAR_MODE')) {
# define('_VAR_MODE', 'recalcul');
#}
if (!empty($GLOBALS['argv'])) {
// passer les argv en set_request pour compat
$args = $GLOBALS['argv'];
array_shift($args);
$_GET = [];
foreach ($args as $arg) {
$arg = explode('=', $arg, 2);
if (count($arg) === 2) {
$_GET[$arg[0]] = $arg[1];
}
}
}
require_once dirname(_SPIP_TEST_INC) . '/ecrire/inc_version.php';
include_once __DIR__ . '/test_fonctions.php';
// pour notice sur recuperer_fond()
if (!isset($GLOBALS['spip_lang'])) {
include_spip('inc/lang');
utiliser_langue_visiteur();
}
// vous devez theoriquement definir $test avant d'inclure ce script
#spip_log('test ' . $test,'testrunner');
$GLOBALS['taille_des_logs'] = 1024;
$GLOBALS['compteur_essai'] = 0;
// pas admin ? passe ton chemin (ce script est un vilain trou de securite)
if (!defined('_IS_CLI') or !_IS_CLI) {
if ((!isset($GLOBALS['visiteur_session']['statut'])
OR $GLOBALS['visiteur_session']['statut'] != '0minirezo')
AND !in_array($_SERVER["REMOTE_ADDR"], ['127.0.0.1', '127.0.1.1', '::1']) ) {
die('Administrateur local requis !');
}
}
else {
$_SERVER['REQUEST_METHOD'] = 'GET'; // eviter des notices dans les tests
tests_loger_webmestre();
}
// afficher toutes les erreurs
@ini_set('display_errors', 'On');
@error_reporting(E_ALL);
// pour essayer de calculer/montrer le temps qu'on y met
if (!defined('_IS_CLI') or !_IS_CLI) {
register_shutdown_function('afficher_timer', time() + (float)microtime());
}
function afficher_timer($depart) {
if (!defined('_NO_TIMER'))
echo sprintf(" %.2fs", time() + (float)microtime() - $depart);
}
<?php
declare(strict_types=1);
use cogpowered\FineDiff\Diff;
use cogpowered\FineDiff\Granularity\Paragraph;
use cogpowered\FineDiff\Render\Html;
use cogpowered\FineDiff\Render\Text;
// pour FineDiff
#include_once _SPIP_TEST_INC . '/vendor/autoload.php';
function tests_init_dossier_squelettes() {
$GLOBALS['dossier_squelettes'] = _DIR_TESTS . 'tests/legacy/squelettes';
}
function tests_loger_webmestre() {
// il faut charger une session webmestre
include_spip('base/abstract_sql');
$webmestre = sql_fetsel('*', 'spip_auteurs', "statut='0minirezo' AND webmestre='oui'", '', 'id_auteur', '0,1');
include_spip('inc/auth');
auth_loger($webmestre);
}
/**
* fonction pas obligatoire a utiliser mais qui simplifie la vie du testeur $fun: le nom de la fonction a tester
* $essais: un tableau d'items array(résultat, arg1, arg2 ...) a tester descriptif dans l'index "je teste
* ca"=>array(...) si pas d'index, "test {numero}" sera utilise retourne un tableau de textes d'erreur dont le but est
* d'etre vide :)
*/
function tester_fun($fun, $essais, $opts = []) {
// pas d'erreur au depart
$err = [];
// let's go !
foreach ($essais as $titre => $ess) {
switch (is_countable($ess) ? count($ess) : 0) {
case 0:
$res = null;
break;
case 1:
$res = $fun();
break;
case 2:
$res = $fun($ess[1]);
break;
case 3:
$res = $fun($ess[1], $ess[2]);
break;
case 4:
$res = $fun($ess[1], $ess[2], $ess[3]);
break;
case 5:
$res = $fun($ess[1], $ess[2], $ess[3], $ess[4]);
break;
default:
$copy = $ess;
array_shift($copy);
$res = call_user_func_array($fun, $copy);
}
$ok = false;
$expected = null;
$affdiff = true;
if (
is_array($ess) && is_array($ess[0]) && (isset($ess[0][0])
&& is_string($ess[0][0]) && function_exists($ess[0][0]) && isset($ess[0][1]) && isset($ess[0][2]))
) {
$ok = ($ess[0][0]($ess[0][1], $res) === $ess[0][2]);
$expected = $ess[0][0] . '(' . sql_quote($ess[0][1]) . ', $res) == ' . sql_quote($ess[0][2]);
$affdiff = false;
} else {
$ok = test_equality($res, $ess[0]);
}
spip_log(
'test ' . $GLOBALS['test'] . ' : Essai ' . $GLOBALS['compteur_essai']++ . ($ok ? ' ok' : ' ECHEC'),
'testrunner'
);
if (!$ok) {
$erritem_args = [];
$essCount = count($ess);
for ($iarg = 1; $iarg < $essCount; ++$iarg) {
$erritem_args[] = htmlspecialchars(var_export($ess[$iarg], true));
}
$opts['affdiff'] = $affdiff;
$err[] = display_error($titre, "{$fun}(" . implode(', ', $erritem_args) . ')', $res, $expected ?: $ess[0], $opts);
}
}
if (defined('_IS_CLI') && _IS_CLI && count($err)) {
exit;
}
return $err;
}
class SpipTestFineDiffRenderer extends Text
{
public function callback($opcode, $from, $offset, $length): string {
$content = substr($from, $offset, $length);
switch ($opcode) {
case 'c':
return ' ' . $content . PHP_EOL;
case 'd':
return '- ' . $content . PHP_EOL;
case 'i':
return '+ ' . $content . PHP_EOL;
}
}
}
function display_error($titre, $call, $result, $expected, $opts = []) {
$out = null;
static $bef, $mid, $end;
static $style;
if (defined('_IS_CLI') && _IS_CLI) {
echo "\n/!\ FAIL test `{$titre}`\n--- Expected\n+++ Actual\n@@ @@\n";
$from = var_export($expected, true);
$FineDiff = new Diff();
$FineDiff->setRenderer(new SpipTestFineDiffRenderer());
$FineDiff->setGranularity(new Paragraph());
echo $FineDiff->render($from, var_export($result, true));
} else {
if (!isset($bef)) {
// options
foreach (
[
'out' => '<dt>@</dt><dd class="ei">@</dd>',
] as $opt => $def
) {
${$opt} = $opts[$opt] ?? $def;
}
// l'enrobage de sortie
[$bef, $mid, $end] = explode('@', $out ?? '');
}
$affdiff = true;
if (isset($opts['affdiff'])) {
$affdiff = $opts['affdiff'];
}
if ($style === null) {
$style = '<style>.ei del {background: none repeat scroll 0 0 #FFDDDD;color: #FF0000;text-decoration: none;}
.ei ins {background: none repeat scroll 0 0 #DDFFDD;color: #008000;text-decoration: none;}
.ei pre {word-wrap: break-word}
.ei table {border-collapse: collapse;border:1px solid #BBB;}
.ei td,.ei th{border-collapse: collapse;border:1px solid #BBB;padding:5px;text-align: left}
.ei dt {font-weight: bold;font-size: 1.2em;}
.ei dd {margin-bottom: 1em;}
</style>';
} else {
$style = '';
}
$FineDiff = new Diff();
$FineDiff->setRenderer(new Html());
$diff = $FineDiff->render(var_export($expected, true), var_export($result, true));
return $style
. $bef
. (is_numeric($titre) ? "test {$titre}" : htmlspecialchars($titre))
. $mid
. "<pre>{$call}</pre>"
. "<table style='width:100%;'><tr><th>diff</th><th>attendu</th><th>resultat</th></tr><tr>"
. '<td><pre>' . ($affdiff ? $diff : $affdiff) . '</pre></td>'
. '<td><pre>' . htmlspecialchars(var_export($expected, true)) . '</pre></td>'
. '<td><pre>' . htmlspecialchars(var_export($result, true)) . '</pre></td>'
. '</tr></table>'
. $end . "\n";
}
}
if (!function_exists('array_diff_assoc_recursive')) {
// http://www.php.net/manual/fr/function.array-diff-assoc.php#73972
function array_diff_assoc_recursive($array1, $array2) {
foreach ($array1 as $key => $value) {
if (is_array($value)) {
if (!isset($array2[$key])) {
$difference[$key] = $value;
} elseif (!is_array($array2[$key])) {
$difference[$key] = $value;
} else {
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if ($new_diff !== []) {
$difference[$key] = $new_diff;
}
}
} elseif (!array_key_exists($key, $array2) || !test_equality($array2[$key], $value)) {
$difference[$key] = $value;
}
}
return $difference ?? [];
}
}
function test_equality($val1, $val2) {
if (is_array($val1) && is_array($val2)) {
return !(is_countable(array_diff_assoc_recursive($val1, $val2)) ? count(
array_diff_assoc_recursive($val1, $val2)
) : 0) && !(is_countable(
array_diff_assoc_recursive($val2, $val1)
) ? count(array_diff_assoc_recursive($val2, $val1)) : 0)
;
} elseif (is_array($val1) || is_array($val2)) {
return false;
} elseif (is_float($val1) || is_float($val2)) {
return abs($val1 - $val2) <= 1e-10 * abs($val1);
}
return $val1 === $val2;
}
function tests_legacy_lister($extension = null) {
// chercher les bases de tests
$bases = [_DIR_TESTS . 'tests/legacy/unit'];
foreach (creer_chemin() as $d) {
if ($d === 'ecrire/') {
continue;
}
if ($d && @is_dir("{$d}tests")) {
$bases[] = "{$d}tests";
}
}
if (!$extension) {
$extension = 'php|html';
}
$liste_fichiers = [];
foreach ($bases as $base) {
// regarder tous les tests
$tests = preg_files($base .= '/', '/\w+/.*\.(' . $extension . ')$');
foreach ($tests as $test) {
$t = (string) _request('rech');
if (strlen($t) && (!str_contains($test, $t))) {
continue;
}
//ignorer le contenu du jeu de squelettes dédié aux tests
if (stristr($test, 'squelettes/')) {
continue;
}
//ignorer le contenu des donnees de test
if (stristr($test, 'data/')) {
continue;
}
//ignorer les tests todo
if (stristr($test, '/_todo_')) {
continue;
}
if (stristr($test, 'bootstrap.php')) {
continue;
}
$testbasename = basename($test);
// ignorer les vrais tests PHPUnit
if (strlen($testbasename) > 8 && str_ends_with($testbasename, 'Test.php')) {
continue;
}
if (!str_starts_with($testbasename, 'inclus_') && !str_ends_with(
$testbasename,
'_fonctions.php'
) && (!str_starts_with($testbasename, 'NA_') || _request('var_mode') === 'dev')) {
$joli = preg_replace('#\.(php|html)$#', '', basename($test));
$section = dirname($test);
if (str_starts_with($base, _DIR_TESTS)) {
$section = substr($section, strlen(_DIR_TESTS . '/tests'));
}
$titre = "{$section}/{$joli}";
if (isset($liste_fichiers[$titre])) {
$nb = 0;
do {
++$nb;
$suffixe = '_' . str_pad(strval($nb), 2, '0', STR_PAD_LEFT);
} while (isset($liste_fichiers[$titre . $suffixe]));
$titre .= $suffixe;
}
$liste_fichiers[$titre] = $test;
}
}
}
return $liste_fichiers;
}
<?php
declare(strict_types=1);
$test = 'email_valide';
$remonte = __DIR__ . '/';
while (!is_file($remonte . 'test.inc')) {
$remonte .= '../';
}
require $remonte . 'test.inc';
include_spip('inc/filtres');
?>
<p>Il existe une diff&eacute;rence entre la d&eacute;finition g&eacute;n&eacute;rale (RFC 822) et l&#x27;usage r&eacute;el qui est fait des adresses de courriel.</p>
<p>Les registar et h&eacute;bergeurs principaux ne respectent d&#x27;ailleurs pas cette d&eacute;finition alors m&ecirc;me que ce sont eux qui permettent &agrave; la majorit&eacute; des gens de d&eacute;finir leurs adresses mails et qui bien souvent servent de serveur SMTP. (Il ne m&#x27;est pas possible actuellement de tester d&#x27;autres serveurs SMTP).</p>
<p>Selon Dreamhost :</p>
<ul>
<li>Un courriel commence par une lettre, un chiffre, un tiret, un tiret bas, un plus ou un &amp;,</li>
<li>Un courriel peut contenir des caract&egrave;res alphanum, des points, des tirets, des tirets bas, des plus, des &amp;.</li>
</ul>
<p>L&#x27;adresse <em>&amp;-_+.spip17&amp;-_+.@domaine.com</em> est donc valide.</p>
<p>Selon OVH :</p>
<ul>
<li>Un courriel commence par une lettre, un chiffre, un tiret ou un tiret bas,</li>
<li>Un courriel peut contenir des caract&egrave;res alphanum, des points, des tirets ou des tirets bas.</li>
</ul>
<p>L&#x27;adresse <em>&amp;-_+.spip17&amp;-_+.@domaine.com</em> n&#x27;est donc pas valide et m&ecirc;me rejet&eacute;e par le serveur SMTP d&#x27;OVH. L&#x27;adresse -spip17_.@domaine.com est quant &agrave; elle valid&eacute;e.</p>
<p>De plus, il convient de faire le distingo entre un usage que je pense classique et majoritaire de SPIP : Internet, et un usage limit&eacute; &agrave; une utilisation locale. Peut &ecirc;tre que SPIP devrait avoir 2 regexp diff&eacute;rentes pour ces 2 usages, deux fonctions ou 1 argument suppl&eacute;mentaire &agrave; l&#x27;actuelle.</p>
<p>Une utilisation locale permet des noms de domaines vari&eacute;s, et sans extension.</p>
<p>Les noms de domaines publics (qui, je pense, sont majoritairement utilis&eacute;s pour SPIP) quant &agrave; eux respectent des r&egrave;gles plus strictes :</p>
<ul>
<li>Un nom de domaine commence par une lettre ou un chiffre,</li>
<li>Un nom de domaine peut contenir des caract&egrave;res alphanum&eacute;riques, des tirets ou des points (cas des sous domaines),</li>
<li>Une extension de domaine <strong>public</strong> contient au moins 2 lettres, au plus 6. ( http://www.iana.org/domains/root/db/index.html )</li>
</ul>
<p><strong>SPIP, de part son respect &agrave; la norme RFC 822 permet donc aujourd&#x27;hui l&#x27;usage d&#x27;adresses mails qui ne sont clairement pas valides dans notre utilisation quotidienne, que je pense majoritaire, de l&#x27;outil SPIP. Il est actuellement ainsi possible de valider les adresses :</strong></p>
<ul>
<li>Jun 20 21:29:32 &lt;cerdic&gt;&quot;Par exemple, l&#x27;adresse compl&egrave;tement farfelue: #+^-`&amp;%_=|/|_?=!&sect;{}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@mail.com est, suivant la norme, une adresse parfaitement valide.&quot;</li>
<li>utilisateur@domaine.f</li>
<li>utilisateur@domaine.frfrfrfrfrfr</li>
<li>d@d</li>
</ul>
<p>Qui &agrave; mon sens ne devraient pas l&#x27;&ecirc;tre.</p>
<p><em>Se pose donc peut &ecirc;tre le cas des extensions de domaines arabes ou qui me seraient inconnus (et courants) de plus de 6 caract&egrave;res, mais il me semble que les dommages collat&eacute;raux caus&eacute;s par l&#x27;utilisation d&#x27;une RegExp non respectueuse des standards mais beaucoup moins permissive (appliqu&eacute;e &agrave; un usage courant) sont moins importants que ceux de la RegExp actuelle bien trop permissive utilis&eacute;e par SPIP. Je descendrais m&ecirc;me personnellement &agrave; 4 pour l&#x27;extension, tant pis pour .travel et .museum... &deg;_&deg;</em></p>
<!-- /* Fonction d'origine de SPIP */ -->
<h1>Fonction email_valide() de SPIP</h1>
<p>Ces mails sont valides, et bien reconnus.</p>
<?php
$emails_valides = ['utilisateur@domaine.com', 'uti-lisa.teur@domai-ne.fr', '&-_+.spip17&-_+.@domaine.com'];
echo '<ul>';
foreach ($emails_valides as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_valide() -> ' . email_valide($email) . '</li>';
}
echo '</ul>';
?>
<!-- // Emails qui ne devraient pas être valides -->
<p><strong>Ce mail est valide selon la RFC822 (mais &agrave; mon sens ne devrait pas l&#x27;&ecirc;tre), et rejet&eacute; par SPIP</strong></p>
<?php
$emails_non_valides_mais_valides = ['#+^-`&%_=|/|_?=!§{}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@mail.com'];
echo '<ul style="font-weight:bold;">';
foreach ($emails_non_valides_mais_valides as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_valide() -> ' . email_valide($email) . '</li>';
}
echo '</ul>';
?>
<!-- // Emails qui ne devraient pas être valides -->
<p><strong>Ces mails sont valides, mais &agrave; mon sens devraient &ecirc;tre rejet&eacute;s dans un usage classique :</strong></p>
<?php
$emails_non_valides_mais_valides = [
'utilisateur@domaine.f',
'utilisateur@domaine.frfrfrfrfrfr',
'd@d',
'&&?julien@domaine.fr',
];
echo '<ul style="font-weight:bold;">';
foreach ($emails_non_valides_mais_valides as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_valide() -> ' . email_valide($email) . '</li>';
}
echo '</ul>';
?>
<!-- // Emails effectivement rejetés -->
<p>Ces mails sont non valides, et filtr&eacute;s correctement.</p>
<?php
$emails_non_valides_rejetes = ['utilisateurdomaine.f', 'utilis/@domaine', 'utilisateur@', '@domaine.fr'];
echo '<ul>';
foreach ($emails_non_valides_rejetes as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_valide() -> ' . email_valide($email) . '</li>';
}
echo '</ul>';
?>
<!-- /* Suggestion d'expression régulière */ -->
<h1>Suggestion d'am&eacute;lioration</h1>
<p>Expression r&eacute;guli&egrave;re propos&eacute;e (respectant Dreamhost, plus permissif que OVH et excluant les extensions de domaine de plus de 4 caract&egrave;res) :</p>
<p><strong>^([A-Za-z0-9]|&|+|_|-]){1}([A-Za-z0-9]|&|+|_|-|\.)*@[A-Za-z0-9]([A-Za-z0-9]|-|\.){2,}\.[A-Za-z]{2,4}$</strong></p>
<?php
function email_public_valide($adresses) {
// Si c'est un spammeur autant arreter tout de suite
if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $adresses)) {
spip_log("Tentative d'injection de mail : {$adresses}");
return false;
}
foreach (explode(',', $adresses) as $v) {
// nettoyer certains formats
// "Marie Toto <Marie@toto.com>"
$adresse = trim(preg_replace(',^[^<>"]*<([^<>"]+)>$,i', '\\1', $v));
// RFC 822 non respectée
if (
!preg_match(
'#^([A-Za-z0-9]|\+|&|_|-|]){1}([A-Za-z0-9]|\+|&|_|-|\.)*@[A-Za-z0-9]([A-Za-z0-9]|-|\.){2,}\.[A-Za-z]{2,4}$#',
$adresse
)
) {
return false;
}
}
return $adresse;
}
?>
<p>Ces mails sont valides, et bien reconnus.</p>
<?php
$emails_valides = [
'utilisateur@domaine.com',
'uti-lisa.teur@domai-ne.fr',
'&-_+.spip17&-_+.@domaine.com',
'-@domaine.fr',
];
echo '<ul>';
foreach ($emails_valides as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_public_valide() -> ' . email_public_valide($email) . '</li>';
}
echo '</ul>';
?>
<!-- // Emails effectivement rejetés -->
<p>Ces mails sont non valides, et filtr&eacute;s correctement.</p>
<?php
$emails_non_valides_rejetes = [
'#+^-`&%_=|/|_?=!§{}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@mail.com',
'utilisateur@domaine.frfrfrfrfrfr',
'd@d',
'utilisateurdomaine.f',
'utilis/@domaine',
'utilisateur@',
'@domaine.fr',
];
echo '<ul>';
foreach ($emails_non_valides_rejetes as $tests => $email) {
echo '<li>' . $email . ' -> pass&eacute;s par email_public_valide() -> ' . email_public_valide($email) . '</li>';
}
echo '</ul>';
<?php
declare(strict_types=1);
/**
* Lance la suite de tests de Dominic Sayers
*
* @link http://www.dominicsayers.com/isemail
* @link Norme 5322 : http://www.dominicsayers.com/isemail/isemail/RFC5322BNF.html
*/
$test = 'email_valider_5322';
$remonte = __DIR__ . '/';
while (!is_file($remonte . 'test.inc')) {
$remonte .= '../';
}
require $remonte . 'test.inc';
include_spip('inc/filtres');
$err = false;
$nb_positifs = 0;
$faux_positifs = 0;
$faux_negatifs = 0;
function unitTest($email, $expected, $source = '', $comment = '') {
$diagnosis = email_valide($email);
$valid = ($diagnosis !== '');
$not = ($valid) ? 'Valide' : 'Non valide';
$comment = ($comment === '') ? '&nbsp;' : stripslashes("{$comment}");
$class = 'ok';
if ($valid !== $expected) {
$GLOBALS['err'] = true;
$class = 'erreur';
if ($valid) {
++$GLOBALS['faux_positifs'];
} else {
++$GLOBALS['faux_negatifs'];
}
} else {
++$GLOBALS['nb_positifs'];
}
return "<dd class='" . $class . "'><span class=\"address\"><em>{$email}</em></span> <br />\n" .
"<span class=\"valid\">{$not} (" . (($valid === $expected) ? 'OK' : 'erreur') . ')</span>' .
($source ? "<span class=\"source\">Source : {$source}</span>" : '') .
(($comment !== '&nbsp;') ? "<span class=\"comment\">({$comment})</span>" : '') .
"</dd>\n";
}
$style = '<style type="text/css">' .
'.valid,.comment,.source {margin-left:20px;}' .
'.valid {display:inline-block;width:150px;}' .
'</style>';
$document = new DOMDocument();
$document->load(__DIR__ . '/email_valide_5322.xml');
$suite = $document->getElementsByTagName('tests')
->item(0);
if ($suite->hasAttribute('version')) {
$version = $suite->getAttribute('version');
$entete = "<h3>Suite de tests de validit&eacute; des adresses email -- version {$version}</h3>\n";
}
$testList = $document->getElementsByTagName('test');
for ($i = 0; $i < $testList->length; ++$i) {
$tagList = $testList->item($i)
->childNodes;
$address = '';
$valid = '';
$comment = '';
for ($j = 0; $j < $tagList->length; ++$j) {
$node = $tagList->item($j);
if ($node->nodeType === XML_ELEMENT_NODE) {
$name = $node->nodeName;
${$name} = $node->nodeValue;
}
}
$expected = $valid === 'true';
$needles = ['\\0', '\\', '"', '$', chr(9), chr(10), chr(13)];
$substitutes = [chr(0), '\\\\', '\\"', '\\$', '\t', '\n', '\r'];
$address = str_replace($needles, $substitutes, $address);
$comment = str_replace($needles, $substitutes, $comment);
$source = str_replace($needles, $substitutes, $source);
$php .= "\$tests[] = unitTest(\"{$address}\", {$valid}, \"{$source}\", \"{$comment}\");\n";
}
eval($php);
// si le tableau $err n'est pas vide ca va pas
if ($GLOBALS['err']) {
echo $style;
echo $entete;
echo '<p><strong>Taux de succ&egrave;s</strong> : ' . ((int) (100 * $nb_positifs / $testList->length)) . " % ( {$faux_positifs} faux positifs et {$faux_negatifs} faux negatifs )</p>";
echo "<dl>\n" . implode("\n", $tests) . '</dl>';
} else {
echo 'OK';
}
Ce diff est replié.
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter