spip 3.2 URL distante non reconnue

Bonjour
J’utilise le plugin owncloud et les fichiers distants sont bien trouvés.
Cependant ils ne sont recopiés dans les documents sans doute suite à cette erreur

  • Fichier : plugins-dist/medias/action/copier_local.php-*Ligne : 95-*Fonction : action_copier_local_post()

echec copie locale https://USERNAME:PASS@webcloud.zaclys.com/remote.php/webdav/tmp/Arr%c3%aat%c3%a9%20D%c3%a9legation%20Carole%20DARMON(1).pdf? n'est pas une URL distante

une adaptation est-elle envisageable ??

Merci

Salut, ton SPIP 3.2 est bien à jour ?

Comment génères-tu ce lien depuis ton nextcloud ? Perso, si je cliquer sur « Lien de partage » pour un fichier, j’obtiens une url du type cloud.xxx.fr/x/XXXXXXXX qui permet d’obtenir un direct du type cloud.xxx.fr/x/XXXXXXXX/download/fichier.txt.

salut,

spip 3.2.12

c’est une config owncloud mise en place avec le plugin « owncloud »
c’est la function construire_url() dans le fichier owncloud_fonctions.php qui construit ce lien…
et qui est décrite dans la doc owncloud.

cette adresse permet de recupérer les fichiers sans etre connecté sur le cloud

nextcloud semble différent et correspond à l’url que tu m’indiques,
mais pour l’instant le plugin pour un client nextcloud patauge et je suis pas encore arrivé à identifier les problemes.

Je confirme, en fait c’est la fonction valider_url_distante qui considère que ton url n’est pas distante à cause de la présence de USERNAME:PASS cf spip/spip: Dépôt officiel du core SPIP Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/spip/[nom du plugin dist] - ecrire/inc/distant.php at 157706e29d135ac1427a0c2031355560b10f23e4 - spip - SPIP on GIT

y a-t-il un moyen de détourner la fonction pour faire un test ?

Vu la position de ce te test dans la fonction, non, mais on je pense que ça mérite un ticket :slight_smile:

comment peut-on deposer ce ticket ?

Si je dis une connerie, tapez pas plis

<?php
function console_log( $data ){
  echo '<script>';
  echo 'console.log('. json_encode( $data ) .')';
  echo '</script>';
}
?>

Luis merci mais je ne comprends rien ta réponse /o\

Ah. Comme tu disais « détourner la fonction » et que BB disait que ce n’était pas possible, je me suis dit que pour lui faire cracher ce qu’il a à un moment donné on pouvait pister en lui faisant faire une console.log.

et où rajouterai-je ce script ?

Je ne suis pas un pro comme tous ici, je bricole. Je l’aurais mis quelque part avant la ligne qui rouspète.
Puis je vois qu’il y a des espaces dans le nom de ton fichier. As-tu essayé de faire la même chose avec un fichier type je_ne_pas_despaces_ni_parentheses.pdf ?

c’est bien la fonction valider_url_distante($source) qui blesse
dans le php le plugins-dist/medias/action/copier_local.php
dans la fonction action_copier_local_post($id_document), si je désactive la vérification des url distantes les fichiers sont bien copiés (avec ou sans espace …)

/**
* https://code.spip.net/@action_copier_local_post
*
* @param  $id_document
* @return bool|mixed|string
*/
function action_copier_local_post($id_document) {

	// Il faut la source du document pour le copier
	$row = sql_fetsel('mode,fichier, descriptif, credits', 'spip_documents', 'id_document='.intval($id_document));
	$source = $row['fichier'];

	// si la source est bien un fichier distant
	// sinon c'est une donnee moisie, on ne fait rien
	include_spip('inc/distant');
//	if (tester_url_absolue($source)
//		and valider_url_distante($source)) {
		$fichier = copie_locale($source);
		if (
			$fichier
//			and valider_url_distante($source)
		) {
			$fichier = _DIR_RACINE . $fichier;
			$files = array();
			$files[] = array('tmp_name' => $fichier, 'name' => basename($fichier));
			$ajouter_documents = charger_fonction('ajouter_documents', 'action');
			spip_log("convertit doc $id_document en local: $source => $fichier", 'medias');
			$liste = array();
			$ajouter_documents($id_document, $files, '', 0, $row['mode'], $liste);

			spip_unlink($fichier);

			// ajouter l'origine du document aux credits
			include_spip('action/editer_document');
			document_modifier(
				$id_document,
				array('credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source)
			);

			return true;
		} else {
			spip_log("echec copie locale $source", 'medias' . _LOG_ERREUR);
			if ($fichier) {
				@unlink(_DIR_RACINE . $fichier);
			}
		}
//	} else {
//		spip_log("echec copie locale $source n'est pas une URL distante", 'medias' . _LOG_ERREUR);
//	}

	return _T('medias:erreur_copie_fichier', array('nom' => $source));
}
1 « J'aime »

bon maintenant le ticket :frowning:

Ben je crois bien que si :stuck_out_tongue:

Et donc le ticket est ici #5005 - Basic access authentication pour HTTP user agent - spip - SPIP on GIT

La correction n’est pas d’enlever l’appel à tester_url_absolue($source) ou valider_url_distante($source) hein ! Éventuellement d’adapter l’une et/ou l’autre si cela n’introduit pas de problème de sécu.

Oui, bien entendu je ne souhaite pas strapper la validation de l’url :slight_smile:
mais l’url est refusée dès qu’il y a user ou pass
j’ai mis a jour le ticket en précisant les éléments

J’ai proposé les révisions dans gitea pour le fonctionnement en spip3,2

diverses corrections et une révision pour #5005 - Basic access authentication pour HTTP user agent - spip - SPIP on GIT

Quelle suite à donner ?

En discuter dans le ticket :slight_smile: