`renseigner_source_distante` ne prévoit pas qu'on puisse étendre avec une erreur dans le pipeline `renseigner_document_distant`
Le fonction renseigner_source_distante()
est d'ors et déjà prévue pour renvoyer soit un tableau correspondant à un document qui fonctionne, soit une string correspondant à un message d'erreur. C'est utilisé dans l'ajout des documents etc ensuite, les appels de cette fonction testent si c'est un array ou pas et affiche l'erreur.
Cette fonction est complétable/extensible grace au pipeline renseigner_document_distant
, sauf que… après ce pipeline, la fonction ne prévoit QUE de recevoir un tableau complété ou pas, mais jamais directement un message d'erreur.
Du coup si dedans on sait pertinemment que ça doit pas être un document à la fin, impossible de le dire, et la fonction continue son chemin et tente de télécharger le contenu de l'URL donnée en source… et crée un faux document qui sémantiquement ne correspond à rien si nous on savait que ça devait pas se créer.
Exemple : une API JSON ou autre, dans le pipeline on teste si on reconnait cette API, si oui on lit le JSON et on cherche le vrai fichier final à mettre en document SPIP : si ça marche on remplit un array, mais si on n'y arrive pas et qu'on ne renvoie donc rien (ou même si on tente de renvoyer une string erreur), SPIP re-télécharge lui aussi le JSON avec recuperer_infos_distantes() et génère un document SPIP machin.json.
Solution backportable en 4.2 et 4.3 (car c'est un bug de générer des faux documents qui n'en sont pas, quand on sait que ça doit pas en être) : ne pas juste tester if (!isset($a['fichier']) or !isset($a['mode']))
mais aussi tester si c'est pas déjà une string, et dans ce cas la renvoyer telle quelle, sans continuer.
https://git.spip.net/spip/medias/-/blob/master/inc/renseigner_document.php?ref_type=heads#L61