Samx Here
n1udSecurity


Server : Apache
System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64
User : hednacluml ( 122243)
PHP Version : 8.3.9
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
Directory :  /home/hednacluml/jobs/plugins/auto/saisies/verifier/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/hednacluml/jobs/plugins/auto/saisies/verifier/saisies_option_data.php
<?php

/**
 * API de vérification : vérification qu'une chaîne puisse décrire un tableau de data pour une saisies
 *
 * @plugin     saisies
 */

// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}
/**
 * Vérifier qu'une saisie est sous forme d'une chaine transformable en tableau de data
 * C'est-à-dire de la forme cle|valeur
 * Et ce en autorisant les sous-groupes (sauf si demande contraire)
 * Mais en refusant les clés construite automatiquement pour des lignes sans pipe.
 * On en profite pour vérifier qu'il n'y pas de clé en double.
 * De plus les trim() pertubent les choses.
 * @param string $valeur
 *   La valeur à vérifier.
 * @param $options
 *	 interdire_sous_groupes => True|False
 *	 verifier_cles => array décrivant une vérification à effectuer
 * @return string
 *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
 */
function verifier_saisies_option_data_dist($valeur, $options = []) {

	// Le pb des clés implicites : on veut les interdire, car, bien que cela soit supporté historiquement par saisies_chaine2tableau, elles ne permettent pas d'assurer la cohésion dans le temps des données.
	// Voir discussion sur https://git.spip.net/spip-contrib-extensions/saisies/issues/54
	// Chercher les clés numériques dans $tableau_plat = saisies_aplatir_tableau(saisies_chaine2tableau($saisies)) ne marche pas car:
	//	 a. Des gens peuvent mettre des clés numériques explicites
	//	 b. Mais celles-ci peuvent être écrasées par les clés implicites (c'est vraiment la plaie les clés implicites)
	// Ex :
	// 1|Cle explicite
	// cle implicite
	// Et bien la clé implicite (1) surchargera la clé explicite.
	//	 c. Et l'on ne peut même pas vérifier la correspondance entre la clé dans $tableau_plat et une ce qu'on trouverai par une regexp dans $valeur, car dans $tableau_plat les chaines de langues ont deja été étendu. Donc rechercher <cle>|<valeur_humaine> dans $valeurs à partir de $tableau_plat peut échouer à tord
	// Par conséquent, pour déterminer les clés implicites, nous sommes obligés de parser les lignes du tableau et d'exclure :
	// 1. Les lignes vides
	// 2. Les débuts de sous-groupes
	// 3. Les fins de sous-groupes
	// 4. Les lignes avec clés explicites
	$lignes = explode("\n", $valeur);
	$lignes_avec_cle_implicite = array_filter($lignes, function ($ligne) {
		return
			trim($ligne)
			&& substr($ligne, 0, 1) !== '*'
			&& substr($ligne, 0, 2) !== '/*'
			&& !preg_match('#^(.*)\|#m', $ligne);
	});
	if ($lignes_avec_cle_implicite) {
		return _T('saisies:verifier_saisies_option_data_cle_manquante');
	}

	// Les sous groupes sont-ils interdits?
	if (
		($options['interdire_sous_groupes'] ?? '')
	) {
		foreach ($lignes as $ligne) {
			if (substr($ligne, 0, 1) === '*') {
				return _T('saisies:verifier_saisies_option_data_sous_groupes_interdits');
			}
		}
	}

	// Y-a-il des clés en double ?
	// On ne peut pas partir de $tableau_plat = saisies_aplatir_tableau(saisies_chaine2tableau($saisies)) car dans un $array php les clés sont déjà dédoublés
	preg_match_all('#^(.*)\|#m', $valeur, $les_cles);
	$les_cles = $les_cles[1];
	if ($les_cles != array_unique($les_cles)) {
		return _T('saisies:verifier_saisies_option_data_cles_doubles');
	}

	// Vérifier, si besoin, que toutes les clés répondent bien à certains critères (qu'on définit via une description de vérification).
	if (is_array($options['verifier_cles'] ?? '')) {
		$verifier = charger_fonction('verifier', 'inc');
		$cles_erronnees = [];
		foreach ($les_cles as $cle) {
			if ($erreur = $verifier($cle, $options['verifier_cles']['type'], $options['verifier_cles']['options'])) {
				$cles_erronnees[] = "$cle => $erreur";
			}
		}
		if ($cles_erronnees) {
			return _T('saisies:verifier_saisies_option_data_verifier_cles_erreurs') . '<br />' . implode('<br />', $cles_erronnees);
		}
	}

	// Et sinon, c'est que cela passe
	return '';
}

SAMX