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
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
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.
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.
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.
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));
}
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
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