Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/medias
  • pierre.laszczak/medias
  • cy.altern/medias
  • MathieuAlphamosa/medias
  • taffit/medias
  • RealET/medias
  • johan/medias
  • Yohooo/medias
  • pierretux/medias
  • placido/medias
  • JLuc/medias
11 résultats
Afficher les modifications
Validations sur la source (847)
Affichage de
avec 1662 ajouts et 1270 suppressions
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[composer.json]
indent_style = space
[CHANGELOG, *.md]
indent_size = 2
* text=auto !eol
action/acceder_document.php -text
action/ajouter_documents.php -text
action/changer_mode_document.php -text
action/copier_local.php -text
action/dissocier_document.php -text
action/editer_document.php -text
action/supprimer_document.php -text
action/supprimer_tous_orphelins.php -text
action/tourner.php -text
action/verifier_documents_brises.php -text
action/verifier_documents_liens.php -text
base/medias.php -text
base/typedoc.php -text
formulaires/changer_fichier_document.html -text
formulaires/changer_fichier_document.php -text
formulaires/configurer_documents.html -text
formulaires/configurer_documents.php -text
formulaires/editer_document.html -text
formulaires/editer_document.php -text
formulaires/illustrer_document.html -text
formulaires/illustrer_document.php -text
formulaires/inc-lister_archive_jointe.html -text
formulaires/inc-upload_document.html -text
formulaires/joindre_document.html -text
formulaires/joindre_document.php -text
inc/choisir_mode_document.php -text
inc/documenter_objet.php -text
inc/documents.php -text
inc/getdocument.php -text
inc/joindre_document.php -text
inc/marquer_doublons_doc.php -text
inc/renseigner_document.php -text
inc/verifier_document_mode_image.php -text
inc/verifier_document_mode_vignette.php -text
inc/vignette.php -text
javascript/jquery.multifile.js -text
javascript/medias_edit.js -text
lang/medias.xml -text
lang/medias_ar.php -text
lang/medias_ast.php -text
lang/medias_ay.php -text
lang/medias_bg.php -text
lang/medias_br.php -text
lang/medias_bs.php -text
lang/medias_ca.php -text
lang/medias_co.php -text
lang/medias_cpf.php -text
lang/medias_cpf_hat.php -text
lang/medias_cs.php -text
lang/medias_da.php -text
lang/medias_de.php -text
lang/medias_el.php -text
lang/medias_en.php -text
lang/medias_en_hx.php -text
lang/medias_eo.php -text
lang/medias_es.php -text
lang/medias_eu.php -text
lang/medias_fa.php -text
lang/medias_fon.php -text
lang/medias_fr.php -text
lang/medias_fr_tu.php -text
lang/medias_gl.php -text
lang/medias_hac.php -text
lang/medias_he.php -text
lang/medias_hr.php -text
lang/medias_hu.php -text
lang/medias_id.php -text
lang/medias_is.php -text
lang/medias_it.php -text
lang/medias_it_fem.php -text
lang/medias_ja.php -text
lang/medias_km.php -text
lang/medias_la.php -text
lang/medias_lb.php -text
lang/medias_lt.php -text
lang/medias_my.php -text
lang/medias_nap.php -text
lang/medias_nb.php -text
lang/medias_ne.php -text
lang/medias_nl.php -text
lang/medias_oc_auv.php -text
lang/medias_oc_gsc.php -text
lang/medias_oc_lms.php -text
lang/medias_oc_lnc.php -text
lang/medias_oc_ni.php -text
lang/medias_oc_ni_la.php -text
lang/medias_oc_prv.php -text
lang/medias_oc_va.php -text
lang/medias_pl.php -text
lang/medias_pt.php -text
lang/medias_pt_br.php -text
lang/medias_ro.php -text
lang/medias_roa.php -text
lang/medias_ru.php -text
lang/medias_sk.php -text
lang/medias_sq.php -text
lang/medias_sv.php -text
lang/medias_tr.php -text
lang/medias_vi.php -text
lang/medias_wo.php -text
lang/medias_zh.php -text
lang/paquet-medias.xml -text
lang/paquet-medias_ar.php -text
lang/paquet-medias_de.php -text
lang/paquet-medias_en.php -text
lang/paquet-medias_es.php -text
lang/paquet-medias_fa.php -text
lang/paquet-medias_it.php -text
lang/paquet-medias_lb.php -text
lang/paquet-medias_nl.php -text
lang/paquet-medias_pt_br.php -text
lang/paquet-medias_ru.php -text
lang/paquet-medias_sk.php -text
/medias_administrations.php -text
/medias_autoriser.php -text
/medias_fonctions.php -text
/medias_ieconfig.php -text
/medias_pipelines.php -text
metadata/flv.php -text
metadata/html.php -text
metadata/image.php -text
metadata/svg.php -text
metadata/swf.php -text
modeles/application.html -text
modeles/audio.html -text
modeles/doc.html -text
modeles/doc_legende.html -text
modeles/document_case.html -text
modeles/document_case_fonctions.php -text
modeles/document_desc.html -text
modeles/document_desc_fonctions.php -text
modeles/emb.html -text
modeles/emb_fonctions.php -text
modeles/image.html -text
modeles/img.html -text
modeles/text.html -text
modeles/text_csv.html -text
modeles/text_html.html -text
modeles/video.html -text
prive/objets/contenu/portfolio_document.html -text
prive/objets/editer/colonne_document.html -text
prive/objets/editer/document_popup.html -text
prive/objets/infos/document.html -text
prive/objets/liste/documents.html -text
prive/squelettes/contenu/document_edit.html -text
prive/squelettes/contenu/documents.html -text
prive/squelettes/contenu/popin-choisir_document.html -text
prive/squelettes/inclure/ajouter-documents.html -text
prive/squelettes/inclure/ajouter-documents_fonctions.php -text
prive/squelettes/inclure/bouton-supprimer-orphelins.html -text
prive/squelettes/inclure/colonne-documents.html -text
prive/squelettes/inclure/document_infos.html -text
prive/squelettes/inclure/mediatheque-choisir.html -text
prive/squelettes/inclure/mediatheque-galerie.html -text
prive/squelettes/inclure/mediatheque-navigation.html -text
prive/squelettes/inclure/mediatheque-navigation_fonctions.php -text
prive/squelettes/inclure/portfolio-documents.html -text
prive/squelettes/navigation/document_edit.html -text
prive/squelettes/top/documents.html -text
prive/style_prive_plugin_medias.html -text
prive/themes/spip/images/base/audio-16.png -text
prive/themes/spip/images/base/audio-22.png -text
prive/themes/spip/images/base/audio-32.png -text
prive/themes/spip/images/base/distant-22.png -text
prive/themes/spip/images/base/image-24.png -text
prive/themes/spip/images/base/photo-16.png -text
prive/themes/spip/images/base/photo-22.png -text
prive/themes/spip/images/base/photo-32.png -text
prive/themes/spip/images/base/unreadable-22.png -text
prive/themes/spip/images/base/video-16.png -text
prive/themes/spip/images/base/video-22.png -text
prive/themes/spip/images/base/video-32.png -text
prive/themes/spip/images/base/vu-16.png -text
prive/themes/spip/images/distant-16.png -text
prive/themes/spip/images/doc-16.png -text
prive/themes/spip/images/doc-24.png -text
prive/themes/spip/images/doc-32.png -text
prive/themes/spip/images/doc-add-16.png -text
prive/themes/spip/images/doc-add-24.png -text
prive/themes/spip/images/doc-add-32.png -text
prive/themes/spip/images/doc-del-16.png -text
prive/themes/spip/images/doc-del-24.png -text
prive/themes/spip/images/doc-del-32.png -text
prive/themes/spip/images/doc-edit-16.png -text
prive/themes/spip/images/doc-edit-24.png -text
prive/themes/spip/images/doc-edit-32.png -text
prive/themes/spip/images/doc-new-16.png -text
prive/themes/spip/images/doc-new-24.png -text
prive/themes/spip/images/doc-new-32.png -text
prive/themes/spip/images/document-16.png -text
prive/themes/spip/images/document-24.png -text
prive/themes/spip/images/document-32.png -text
prive/themes/spip/images/document-add-16.png -text
prive/themes/spip/images/document-add-24.png -text
prive/themes/spip/images/document-add-32.png -text
prive/themes/spip/images/document-del-16.png -text
prive/themes/spip/images/document-del-24.png -text
prive/themes/spip/images/document-del-32.png -text
prive/themes/spip/images/document-distant-24.png -text
prive/themes/spip/images/document-edit-16.png -text
prive/themes/spip/images/document-edit-24.png -text
prive/themes/spip/images/document-edit-32.png -text
prive/themes/spip/images/document-manquant-24.png -text
prive/themes/spip/images/document-new-16.png -text
prive/themes/spip/images/document-new-24.png -text
prive/themes/spip/images/document-new-32.png -text
prive/themes/spip/images/document-vu-24.png -text
prive/themes/spip/images/image-16.png -text
prive/themes/spip/images/image-24.png -text
prive/themes/spip/images/image-32.png -text
prive/themes/spip/images/image-add-16.png -text
prive/themes/spip/images/image-add-24.png -text
prive/themes/spip/images/image-add-32.png -text
prive/themes/spip/images/image-del-16.png -text
prive/themes/spip/images/image-del-24.png -text
prive/themes/spip/images/image-del-32.png -text
prive/themes/spip/images/image-edit-16.png -text
prive/themes/spip/images/image-edit-24.png -text
prive/themes/spip/images/image-edit-32.png -text
prive/themes/spip/images/image-new-16.png -text
prive/themes/spip/images/image-new-24.png -text
prive/themes/spip/images/image-new-32.png -text
prive/themes/spip/images/media-audio-16.png -text
prive/themes/spip/images/media-audio-24.png -text
prive/themes/spip/images/media-audio-32.png -text
prive/themes/spip/images/media-image-16.png -text
prive/themes/spip/images/media-image-24.png -text
prive/themes/spip/images/media-image-32.png -text
prive/themes/spip/images/media-video-16.png -text
prive/themes/spip/images/media-video-24.png -text
prive/themes/spip/images/media-video-32.png -text
prive/themes/spip/images/portfolio-128.png -text
prive/themes/spip/images/portfolio-16.png -text
prive/themes/spip/images/portfolio-24.png -text
prive/themes/spip/images/portfolio-32.png -text
prive/themes/spip/images/portfolio-64.png -text
prive/themes/spip/images/tourner-180-12.png -text
prive/themes/spip/images/tourner-droite-12.png -text
prive/themes/spip/images/tourner-gauche-12.png -text
prive/themes/spip/images/vu-16-10.png -text
prive/themes/spip/images/vu-16.png -text
prive/themes/spip/images/vu-32.png -text
prive/themes/spip2/images/base/audio-16.png -text
prive/themes/spip2/images/base/audio-22.png -text
prive/themes/spip2/images/base/audio-32.png -text
prive/themes/spip2/images/base/distant-22.png -text
prive/themes/spip2/images/base/image-24.png -text
prive/themes/spip2/images/base/photo-16.png -text
prive/themes/spip2/images/base/photo-22.png -text
prive/themes/spip2/images/base/photo-32.png -text
prive/themes/spip2/images/base/unreadable-22.png -text
prive/themes/spip2/images/base/video-16.png -text
prive/themes/spip2/images/base/video-22.png -text
prive/themes/spip2/images/base/video-32.png -text
prive/themes/spip2/images/base/vu-16.png -text
prive/themes/spip2/images/distant-16.png -text
prive/themes/spip2/images/document-16.png -text
prive/themes/spip2/images/document-24.png -text
prive/themes/spip2/images/document-32.png -text
prive/themes/spip2/images/document-distant-24.png -text
prive/themes/spip2/images/document-manquant-24.png -text
prive/themes/spip2/images/document-vu-24.png -text
prive/themes/spip2/images/media-audio-16.png -text
prive/themes/spip2/images/media-audio-24.png -text
prive/themes/spip2/images/media-audio-32.png -text
prive/themes/spip2/images/media-image-16.png -text
prive/themes/spip2/images/media-image-24.png -text
prive/themes/spip2/images/media-image-32.png -text
prive/themes/spip2/images/media-video-16.png -text
prive/themes/spip2/images/media-video-24.png -text
prive/themes/spip2/images/media-video-32.png -text
prive/themes/spip2/images/portfolio-128.png -text
prive/themes/spip2/images/portfolio-16.png -text
prive/themes/spip2/images/portfolio-24.png -text
prive/themes/spip2/images/portfolio-64.png -text
prive/themes/spip2/images/tourner-180-12.png -text
prive/themes/spip2/images/tourner-droite-12.png -text
prive/themes/spip2/images/tourner-gauche-12.png -text
prive/themes/spip2/images/vu-16-10.png -text
prive/themes/spip2/images/vu-16.png -text
prive/themes/spip2/images/vu-32.png -text
prive/vignettes/3gp.png -text
prive/vignettes/aac.png -text
prive/vignettes/abw.png -text
prive/vignettes/ai.png -text
prive/vignettes/aiff.png -text
prive/vignettes/anx.png -text
prive/vignettes/asf.png -text
prive/vignettes/avi.png -text
prive/vignettes/axa.png -text
prive/vignettes/axv.png -text
prive/vignettes/bin.png -text
prive/vignettes/blend.png -text
prive/vignettes/bmp.png -text
prive/vignettes/bz2.png -text
prive/vignettes/c.png -text
prive/vignettes/cls.png -text
prive/vignettes/css.png -text
prive/vignettes/csv.png -text
prive/vignettes/deb.png -text
prive/vignettes/defaut.png -text
prive/vignettes/djvu.png -text
prive/vignettes/doc.png -text
prive/vignettes/docm.png -text
prive/vignettes/docx.png -text
prive/vignettes/dotm.png -text
prive/vignettes/dotx.png -text
prive/vignettes/dv.png -text
prive/vignettes/dvi.png -text
prive/vignettes/eps.png -text
prive/vignettes/epub.png -text
prive/vignettes/f4a.png -text
prive/vignettes/f4b.png -text
prive/vignettes/f4p.png -text
prive/vignettes/f4v.png -text
prive/vignettes/flac.png -text
prive/vignettes/flv.png -text
prive/vignettes/gif.png -text
prive/vignettes/gz.png -text
prive/vignettes/h.png -text
prive/vignettes/html.png -text
prive/vignettes/index.php -text
prive/vignettes/jpg.png -text
prive/vignettes/kml.png -text
prive/vignettes/kmz.png -text
prive/vignettes/m4a.png -text
prive/vignettes/m4b.png -text
prive/vignettes/m4p.png -text
prive/vignettes/m4u.png -text
prive/vignettes/m4v.png -text
prive/vignettes/mid.png -text
prive/vignettes/mka.png -text
prive/vignettes/mkv.png -text
prive/vignettes/mng.png -text
prive/vignettes/mov.png -text
prive/vignettes/mp3.png -text
prive/vignettes/mp4.png -text
prive/vignettes/mpc.png -text
prive/vignettes/mpg.png -text
prive/vignettes/odb.png -text
prive/vignettes/odc.png -text
prive/vignettes/odf.png -text
prive/vignettes/odg.png -text
prive/vignettes/odi.png -text
prive/vignettes/odm.png -text
prive/vignettes/odp.png -text
prive/vignettes/ods.png -text
prive/vignettes/odt.png -text
prive/vignettes/oga.png -text
prive/vignettes/ogg.png -text
prive/vignettes/ogv.png -text
prive/vignettes/ogx.png -text
prive/vignettes/otg.png -text
prive/vignettes/otp.png -text
prive/vignettes/ots.png -text
prive/vignettes/ott.png -text
prive/vignettes/pas.png -text
prive/vignettes/pdf.png -text
prive/vignettes/pgn.png -text
prive/vignettes/png.png -text
prive/vignettes/potm.png -text
prive/vignettes/potx.png -text
prive/vignettes/ppam.png -text
prive/vignettes/pps.png -text
prive/vignettes/ppsm.png -text
prive/vignettes/ppsx.png -text
prive/vignettes/ppt.png -text
prive/vignettes/pptm.png -text
prive/vignettes/pptx.png -text
prive/vignettes/ps.png -text
prive/vignettes/psd.png -text
prive/vignettes/qt.png -text
prive/vignettes/ra.png -text
prive/vignettes/ram.png -text
prive/vignettes/rm.png -text
prive/vignettes/rpm.png -text
prive/vignettes/rtf.png -text
prive/vignettes/sdd.png -text
prive/vignettes/sdw.png -text
prive/vignettes/sit.png -text
prive/vignettes/smil.png -text
prive/vignettes/spip.png -text
prive/vignettes/spx.png -text
prive/vignettes/sty.png -text
prive/vignettes/svg.png -text
prive/vignettes/swf.png -text
prive/vignettes/sxc.png -text
prive/vignettes/sxi.png -text
prive/vignettes/sxw.png -text
prive/vignettes/tex.png -text
prive/vignettes/tgz.png -text
prive/vignettes/tif.png -text
prive/vignettes/torrent.png -text
prive/vignettes/ttf.png -text
prive/vignettes/txt.png -text
prive/vignettes/wav.png -text
prive/vignettes/webm.png -text
prive/vignettes/wma.png -text
prive/vignettes/wmv.png -text
prive/vignettes/xcf.png -text
prive/vignettes/xlam.png -text
prive/vignettes/xls.png -text
prive/vignettes/xlsb.png -text
prive/vignettes/xlsm.png -text
prive/vignettes/xlsx.png -text
prive/vignettes/xltm.png -text
prive/vignettes/xltx.png -text
prive/vignettes/xml.png -text
prive/vignettes/xspf.png -text
prive/vignettes/zip.png -text
puce_statut/document.php -text
squelettes/contenu/document.html -text
squelettes/document.html -text
squelettes/head/document.html -text
urls/generer_url_document.php -text
urls/generer_url_ecrire_document.php -text
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpstan.neon.dist export-ignore
/phpstan-baseline.neon export-ignore
/rector.php export-ignore
/ecs.php export-ignore
/tests export-ignore
/vendor/
/composer.phar
/composer.lock
/phpstan.neon
# Changelog
## Unreleased
### Added
- spip/spip#5775 Intégration dans médias de fonctions relatives aux logos & documents, qui étaient dans spip/ecrire
### Changed
- #5008 `inc_vignette_dist()` prend un media en second argument, pour décliner la vignette selon le type de fichier
### Fixed
- #5008 Calcul dynamique de `#MIME_TYPE` (qui peut varier par exemple pour les mp4 selon le media de type video, audio, ...)
- #5016 La navigation dans la médiathèque peut recevoir n'importe quel id d'objet
## 5.0.1 - 2025-12-21
### Added
- require `spip/archiviste=^3.0`
### Changed
- spip/spip#5566 / !5018 Animations de sélection/ajout/retrait de documents sans jQuery
## 5.0.0 - 2025-11-27
### Added
- Installable en tant que package Composer
### Changed
- spip/spip#6043 utilisation de la méthode de chargement `initjs`
- Utiliser `#LAYOUT_PRIVE` plutôt que `#LARGEUR_ECRAN`
- #4958 Appel à la globale `$formats_logos` remplacée par `_image_extensions_acceptees_en_entree()`
- Externalisation de la lib [james-heinrich/getid3](https://packagist.org/packages/james-heinrich/getid3)
- Appel de l'archiviste via `use Spip\Archiver\SpipArchiver`
- Compatible SPIP 5.0.0-dev
### Fixed
- spip/spip#5460 Utiliser les propriétés logiques dans la CSS de l'espace privé
- #5000 Ne plus réduire implicitement (dans certains cas) l’image retournée par `#LOGO_DOCUMENT`
- !5008 Corriger la duplication (plugin Duplicator par exemple) de logo si le dossier `tmp/upload` n'existe pas
- #4999 Affichage du sélecteur de rôles de documents (avec le plugin en question)
- !5009 Affichage des aperçus dans les modèles emb
- !5010 Correction chemin des plugins mediaelements
- !5010 Pas de fallback Flash
### Removed
- #4935 Gestion historique du portfolio. Suppression de `_COMPORTEMENT_HISTORIQUE_PORTFOLIO`, `_COMPORTEMENT_HISTORIQUE_IMG_DOC_EMB`
& `affiche_bouton_mode_image_portfolio()` et squelettes liés
# Plugin Médias
Ce plugin gère les documents éditoriaux (médias images, sons, pdf, ...)
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* 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.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/headers');
......@@ -19,106 +20,88 @@ include_spip('inc/headers');
// soit que le document est publie, c'est-a-dire
// joint a au moins 1 article ou rubrique publie
// http://doc.spip.org/@action_acceder_document_dist
function action_acceder_document_dist() {
$doc = [];
include_spip('inc/documents');
// $file exige pour eviter le scan id_document par id_document
$f = rawurldecode(_request('file'));
$f = rawurldecode((string) _request('file'));
$file = get_spip_doc($f);
$arg = rawurldecode(_request('arg'));
$arg = rawurldecode((string) _request('arg'));
$status = $dcc = false;
if (strpos($f,'../') !== false
OR preg_match(',^\w+://,', $f)) {
$status = false;
if (
str_contains($f, '../') || preg_match(',^\w+://,', $f)
) {
$status = 403;
}
else if (!file_exists($file) OR !is_readable($file)) {
$status = 404;
} else {
$where = "documents.fichier=".sql_quote(set_spip_doc($file))
. ($arg ? " AND documents.id_document=".intval($arg): '');
$doc = sql_fetsel("D.id_document, D.titre, D.fichier, T.mime_type, T.inclus, D.extension", "spip_documents AS D LEFT JOIN spip_types_documents AS T ON D.extension=T.extension",$where);
if (!$doc) {
if (!file_exists($file) || !is_readable($file)) {
$status = 404;
} else {
// ETag pour gerer le status 304
$ETag = md5($file . ': '. filemtime($file));
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
http_status(304); // Not modified
exit;
$where = 'D.fichier=' . sql_quote(set_spip_doc($file))
. ($arg ? ' AND D.id_document=' . intval($arg) : '');
$doc = sql_fetsel(
'D.id_document, D.titre, D.fichier, T.mime_type, T.inclus, D.extension',
'spip_documents AS D LEFT JOIN spip_types_documents AS T ON D.extension=T.extension',
$where
);
if (!$doc) {
$status = 404;
} else {
header('ETag: '.$ETag);
}
//
// Verifier les droits de lecture du document
// en controlant la cle passee en argument
//
include_spip('inc/securiser_action');
$cle = _request('cle');
if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
spip_log("acces interdit $cle erronee");
$status = 403;
// ETag pour gerer le status 304
$ETag = md5($file . ': ' . filemtime($file));
if (
isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag
) {
http_response_code(304); // Not modified
exit;
}
header('ETag: ' . $ETag);
//
// Verifier les droits de lecture du document
// en controlant la cle passee en argument
//
include_spip('inc/securiser_action');
$cle = _request('cle');
if (!verifier_cle_action($doc['id_document'] . ',' . $f, $cle)) {
spip_log("acces interdit $cle erronee");
$status = 403;
}
}
}
}
switch($status) {
case 403:
include_spip('inc/minipres');
echo minipres();
break;
case 404:
http_status(404);
include_spip('inc/minipres');
echo minipres(_T('erreur').' 404',
_T('medias:info_document_indisponible'));
break;
default:
header("Content-Type: ". $doc['mime_type']);
// pour les images ne pas passer en attachment
// sinon, lorsqu'on pointe directement sur leur adresse,
// le navigateur les downloade au lieu de les afficher
if ($doc['inclus']=='non') {
// Si le fichier a un titre avec extension,
// ou si c'est un nom bien connu d'Unix, le prendre
// sinon l'ignorer car certains navigateurs pataugent
$f = basename($file);
if (isset($doc['titre'])
AND (preg_match('/^\w+[.]\w+$/', $doc['titre']) OR $doc['titre'] == 'Makefile'))
$f = $doc['titre'];
// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"$f\";");
header("Content-Transfer-Encoding: binary");
// fix for IE catching or PHP bug issue
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
}
if ($cl = filesize($file))
header("Content-Length: ". $cl);
readfile($file);
break;
switch ($status) {
case 403:
include_spip('inc/minipres');
echo minipres();
break;
case 404:
http_response_code(404);
include_spip('inc/minipres');
echo minipres(_T('erreur') . ' 404', _T('medias:info_document_indisponible'));
break;
default:
include_spip('inc/livrer_fichier');
$options = ['attachment' => false];
if ($doc['inclus'] == 'non') {
$options['attachment'] = true;
// Si le fichier a un titre avec extension,
// ou si c'est un nom bien connu d'Unix, le prendre
// sinon l'ignorer car certains navigateurs pataugent
if (
isset($doc['titre']) && (preg_match('/^\w+[.]\w+$/', (string) $doc['titre']) || $doc['titre'] == 'Makefile')
) {
$options['attachment'] = $doc['titre'];
}
}
spip_livrer_fichier($file, $doc['mime_type'], $options);
exit;
break;
}
}
?>
Ce diff est replié.
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* 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.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet de basculer du mode image au mode document et vice versa
*
* http://doc.spip.org/@action_changer_mode_document_dist
*
* @param int $id_document
* @param string $mode
* @return void
*/
function action_changer_mode_document_dist($id_document=null, $mode=null){
if (is_null($id_document) OR is_null($mode)){
function action_changer_mode_document_dist($id_document = null, $mode = null) {
if ($id_document === null || $mode === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^(\d+)\W(\w+)$,", $arg, $r))
if (!preg_match(',^(\d+)\W(\w+)$,', (string) $arg, $r)) {
spip_log("action_changer_mode_document $arg pas compris");
else {
} else {
array_shift($r);
list($id_document, $mode) = $r;
[$id_document, $mode] = $r;
}
}
if ($id_document
AND include_spip('inc/autoriser')
AND autoriser('modifier','document',$id_document))
if (
$id_document && include_spip('inc/autoriser') && autoriser('modifier', 'document', $id_document)
) {
action_changer_mode_document_post($id_document, $mode);
}
}
// http://doc.spip.org/@action_changer_mode_document_post
function action_changer_mode_document_post($id_document, $mode){
function action_changer_mode_document_post($id_document, $mode) {
// - id_document le doc a modifier
// - mode le mode a lui donner
if ($id_document = intval($id_document)
AND in_array($mode, array('vignette', 'image', 'document'))) {
if (
($id_document = intval($id_document))
&& in_array($mode, ['vignette', 'image', 'document'])
) {
include_spip('action/editer_document');
document_modifier($id_document,array('mode'=>$mode));
document_modifier($id_document, ['mode' => $mode]);
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* 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.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fonction appellee lorsque l'utilisateur clique sur le bouton
......@@ -18,63 +19,74 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
* Il s'agit de la partie logique, c'est a dire que cette fonction
* realise la copie.
*
* http://doc.spip.org/@action_copier_local_dist
*
* @param null $id_document
* @return bool|mixed|string
*/
function action_copier_local_dist($id_document=null) {
function action_copier_local_dist($id_document = null) {
if (!$id_document){
if (!$id_document) {
// Recupere les arguments.
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_document = intval($arg);
}
if (!$id_document) {
spip_log("action_copier_local_dist $arg pas compris");
return false;
} else {
// arguments recuperes, on peut maintenant appeler la fonction.
return action_copier_local_post($id_document);
}
// arguments recuperes, on peut maintenant appeler la fonction.
return action_copier_local_post($id_document);
}
/**
* http://doc.spip.org/@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=$id_document");
$row = sql_fetsel('mode,fichier, descriptif, credits', 'spip_documents', 'id_document=' . intval($id_document));
$source = $row['fichier'];
include_spip('inc/distant'); // pour 'copie_locale'
$fichier = copie_locale($source);
if ($fichier) {
$fichier = _DIR_RACINE . $fichier;
$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");
$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;
// 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) && valider_url_distante($source)
) {
// on fait une copie locale en verifiant aussi l'URL finale qui a été récupérée
$fichier = copie_locale($source, 'auto', null, null, 'valider_url_distante');
// on revalide la source *apres* copie car si elle est controlee par un serveur dns malicieux elle peut etre changeante
if (
$fichier && valider_url_distante($source)
) {
$fichier = _DIR_RACINE . $fichier;
$files = [];
$files[] = ['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 = [];
$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, ['credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source]);
return true;
}
spip_log("echec copie locale $source", 'medias' . _LOG_ERREUR);
if ($fichier) {
@unlink(_DIR_RACINE . $fichier);
}
} else {
spip_log("echec copie locale $source");
spip_log("echec copie locale $source n'est pas une URL distante", 'medias' . _LOG_ERREUR);
}
return _T('medias:erreur_copie_fichier',array('nom'=>$source));
}
?>
return _T('medias:erreur_copie_fichier', ['nom' => $source]);
}
<?php
/**
* 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.
*/
/**
* Gestion de l'action desordonner_document
*
* @package SPIP\Medias\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Désordonner des documents
*
* @param string $arg
* fournit les arguments de la fonction dissocier_document
* sous la forme `$id_objet-$objet-$document-suppr-safe`
*
* - 4eme arg : suppr = true, false sinon
* - 5eme arg : safe = true, false sinon
*/
function action_desordonner_liens_documents_dist($arg = null) {
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$arg = explode('-', (string) $arg);
[$id_objet, $objet, $document] = $arg;
if (
($id_objet = intval($id_objet)) && autoriser('desordonnerdocuments', $objet, $id_objet)
) {
desordonner_liens_documents($document, $objet, $id_objet);
} else {
spip_logger()->info("Interdit de désordonner les documents sur : $objet $id_objet");
}
}
/**
* Désordonner des documents
*
* @param int|string $document
* id_document a désordonner
* I/image pour dissocier les images en mode Image
* I/document pour dissocier les images en mode document
* D/document pour dissocier les documents non image en mode document
* @param string $objet
* objet duquel dissocier
* @param $id_objet
* id_objet duquel dissocier
*/
function desordonner_liens_documents($document, $objet, $id_objet) {
include_spip('action/editer_liens');
if ($id_document = intval($document)) {
desordonner_liens_document($id_document, $objet, $id_objet);
} else {
[$image, $mode] = explode('/', $document);
$image = ($image == 'I');
include_spip('inc/filtres_images_lib_mini');
$typdoc = sql_in('docs.extension', _image_extensions_logos(), $image ? '' : 'NOT');
$obj = 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet);
$s = sql_select(
'docs.id_document',
'spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document',
"$obj AND vu='non' AND docs.mode=" . sql_quote($mode) . " AND $typdoc"
);
while ($t = sql_fetch($s)) {
desordonner_liens_document($t['id_document'], $objet, $id_objet);
}
}
}
/**
* Désordonner un document
*
* @param int $id_document
* id_document a désordonner
* @param string $objet
* objet duquel dissocier
* @param $id_objet
* id_objet duquel dissocier
*/
function desordonner_liens_document($id_document, $objet, $id_objet) {
objet_qualifier_liens(['document' => $id_document], [$objet => $id_objet], ['rang_lien' => 0]);
}
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* 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.
*/
/**
* Gestion de l'action dissocier_document
*
* @package SPIP\Medias\Action
**/
if (!defined("_ECRIRE_INC_VERSION")) return;
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Dissocier un document
......@@ -28,39 +27,41 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
*
* - 4eme arg : suppr = true, false sinon
* - 5eme arg : safe = true, false sinon
*
* @return void
*/
function action_dissocier_document_dist($arg=null){
if(is_null($arg)){
function action_dissocier_document_dist($arg = null) {
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// attention au cas ou id_objet est negatif !
if (strncmp($arg,'-',1)==0){
$arg = explode('-',substr($arg,1));
list($id_objet, $objet, $document) = $arg;
if (str_starts_with((string) $arg, '-')) {
$arg = explode('-', substr((string) $arg, 1));
[$id_objet, $objet, $document] = $arg;
$id_objet = -$id_objet;
}
else {
$arg = explode('-',$arg);
list($id_objet, $objet, $document) = $arg;
} else {
$arg = explode('-', (string) $arg);
[$id_objet, $objet, $document] = $arg;
}
$suppr=false;
if (count($arg)>3 AND $arg[3]=='suppr')
$suppr = $check = false;
if (count($arg) > 3 && $arg[3] == 'suppr') {
$suppr = true;
if (count($arg)>4 AND $arg[4]=='safe')
}
if (count($arg) > 4 && $arg[4] == 'safe') {
$check = true;
if ($id_objet=intval($id_objet)
AND (
($id_objet<0 AND $id_objet==-$GLOBALS['visiteur_session']['id_auteur'])
OR autoriser('modifier',$objet,$id_objet)
))
}
if (
($id_objet = intval($id_objet))
&& (
($id_objet < 0 && $id_objet == -$GLOBALS['visiteur_session']['id_auteur'])
|| autoriser('dissocierdocuments', $objet, $id_objet)
)
) {
dissocier_document($document, $objet, $id_objet, $suppr, $check);
else
spip_log("Interdit de modifier $objet $id_objet","spip");
} else {
spip_logger()->info("Interdit de modifier $objet $id_objet");
}
}
/**
......@@ -77,53 +78,65 @@ function action_dissocier_document_dist($arg=null){
* @return bool
*/
function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
if (!$id_document = intval($id_document))
if (!($id_document = intval($id_document))) {
return false;
}
// [TODO] le mettre en paramètre de la fonction ?
$serveur = '';
// D'abord on ne supprime pas, on dissocie
include_spip('action/editer_liens');
objet_dissocier(array('document'=>$id_document),array($objet=>$id_objet));
objet_dissocier(['document' => $id_document], [$objet => $id_objet], ['role' => '*']);
// Si c'est une vignette, l'eliminer du document auquel elle appartient
// cas tordu peu probable
sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
sql_updateq('spip_documents', ['id_vignette' => 0], 'id_vignette=' . $id_document);
// verifier son statut apres une suppression de lien
include_spip('action/editer_document');
document_instituer($id_document);
pipeline('post_edition',
array(
'args' => array(
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='document/$id_document'");
pipeline(
'post_edition',
[
'args' => [
'operation' => 'delier_document', // compat v<=2
'action' => 'delier_document',
'table' => 'spip_documents',
'id_objet' => $id_document,
'objet' => $objet,
'id' => $id_objet
),
'data' => null
)
'id' => $id_objet,
],
'data' => null,
]
);
if ($check) {
// si demande, on verifie que ses documents vus sont bien lies !
$spip_table_objet = table_objet_sql($objet);
$table_objet = table_objet($objet);
$id_table_objet = id_table_objet($objet,$serveur);
$champs = sql_fetsel('*',$spip_table_objet,addslashes($id_table_objet)."=".intval($id_objet));
$id_table_objet = id_table_objet($objet, $serveur);
$champs = sql_fetsel('*', $spip_table_objet, addslashes((string) $id_table_objet) . '=' . intval($id_objet));
$marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc');
$marquer_doublons_doc($champs,$id_objet,$objet,$id_table_objet,$table_objet,$spip_table_objet, '', $serveur);
$marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
$marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur);
}
// On supprime ensuite s'il est orphelin
// et si demande
// ici on ne bloque pas la suppression d'un document rattache a un autre
if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){
$supprimer_document = charger_fonction('supprimer_document','action');
if ($supprime && !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) {
$supprimer_document = charger_fonction('supprimer_document', 'action');
return $supprimer_document($id_document);
}
return true;
}
/**
......@@ -134,7 +147,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
* I/image pour dissocier les images en mode Image
* I/document pour dissocier les images en mode document
* D/document pour dissocier les documents non image en mode document
* @param $objet
* @param string $objet
* objet duquel dissocier
* @param $id_objet
* id_objet duquel dissocier
......@@ -142,22 +155,22 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
* supprimer les documents orphelins apres dissociation
* @param bool $check
* verifier le texte des documents et relier les documents references dans l'objet
* @return void
*/
function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false){
if ($id_document=intval($document)) {
function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false) {
if ($id_document = intval($document)) {
supprimer_lien_document($id_document, $objet, $id_objet, $supprime, $check);
}
else {
list($image,$mode) = explode('/',$document);
$image = ($image=='I');
$typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image ? '' : 'NOT');
$obj = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet);
$s = sql_select('docs.id_document',
"spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document",
"$obj AND vu='non' AND docs.mode=".sql_quote($mode)." AND $typdoc");
} else {
[$image, $mode] = explode('/', $document);
$image = ($image == 'I');
$typdoc = sql_in('docs.extension', ['gif', 'jpg', 'png'], $image ? '' : 'NOT');
$obj = 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet);
$s = sql_select(
'docs.id_document',
'spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document',
"$obj AND vu='non' AND docs.mode=" . sql_quote($mode) . " AND $typdoc"
);
while ($t = sql_fetch($s)) {
supprimer_lien_document($t['id_document'], $objet, $id_objet, $supprime, $check);
}
......@@ -169,4 +182,3 @@ function dissocier_document($document, $objet, $id_objet, $supprime = false, $ch
depublier_branche_rubrique_if($id_objet);
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* 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.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action editer_document
......@@ -19,9 +19,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
* @param int $arg
* @return array
*/
function action_editer_document_dist($arg=null) {
function action_editer_document_dist($arg = null) {
if (is_null($arg)){
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
......@@ -31,122 +31,136 @@ function action_editer_document_dist($arg=null) {
$id_document = document_inserer();
}
if (!$id_document)
return array(0,''); // erreur
if (!$id_document) {
return [0, ''];
} // erreur
$err = document_modifier($id_document);
return array($id_document,$err);
return [$id_document, $err];
}
/**
* Creer un nouveau document
*
* @param int $id_parent
* inutilise, pas de parent pour les documents
* @param array|null $set
* @return int
*/
function document_inserer() {
function document_inserer($id_parent = null, $set = null) {
$champs = array(
$champs = [
'statut' => 'prop',
'date' => 'NOW()',
);
];
if ($set) {
$champs = array_merge($champs, $set);
}
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_documents',
),
'data' => $champs
)
);
$id_document = sql_insertq("spip_documents", $champs);
pipeline('post_insertion',
array(
'args' => array(
$champs = pipeline('pre_insertion', [
'args' => [
'table' => 'spip_documents',
],
'data' => $champs,
]);
$id_document = sql_insertq('spip_documents', $champs);
pipeline(
'post_insertion',
[
'args' => [
'table' => 'spip_documents',
'id_objet' => $id_document
),
'data' => $champs
)
'id_objet' => $id_document,
],
'data' => $champs,
]
);
return $id_document;
}
/**
* Enregistre une revision de document.
* $set est un contenu (par defaut on prend le contenu via _request())
*
* @param int $id_document
* @param array|bool $set
* @param array|null $set
* @return string|null
*/
function document_modifier($id_document, $set=false) {
function document_modifier($id_document, $set = null) {
include_spip('inc/modifier');
include_spip('inc/filtres');
// champs normaux
$champs = collecter_requests(
// white list
objet_info('document','champs_editables'),
objet_info('document', 'champs_editables'),
// black list
array('parents', 'ajout_parents'),
['parents', 'ajout_parents'],
// donnees eventuellement fournies
$set
);
$invalideur = "";
$invalideur = '';
$indexation = false;
// Si le document est publie, invalider les caches et demander sa reindexation
$t = sql_getfetsel("statut", "spip_documents", 'id_document='.intval($id_document));
$t = sql_getfetsel('statut', 'spip_documents', 'id_document=' . intval($id_document));
if ($t == 'publie') {
$invalideur = "id='id_document/$id_document'";
$indexation = true;
}
$ancien_fichier = "";
$ancien_fichier = '';
// si le fichier est modifie, noter le nom de l'ancien pour faire le menage
if (isset($champs['fichier'])){
$ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document));
if (isset($champs['fichier'])) {
$ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document));
}
if ($err = objet_modifier_champs('document', $id_document,
array(
'invalideur' => $invalideur,
'indexation' => $indexation
),
$champs))
if (
$err = objet_modifier_champs(
'document',
$id_document,
[
'data' => $set,
'invalideur' => $invalideur,
'indexation' => $indexation,
],
$champs
)
) {
return $err;
}
// nettoyer l'ancien fichier si necessaire
if (isset($champs['fichier']) // un plugin a pu interdire la modif du fichier en virant le champ
AND $champs['fichier']
AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
AND @file_exists($f = get_spip_doc($ancien_fichier)))
spip_unlink($f);
if (
isset($champs['fichier'])
&& $champs['fichier']
&& $ancien_fichier
&& $ancien_fichier !== $champs['fichier']
&& !tester_url_absolue($ancien_fichier)
&& @file_exists($f = get_spip_doc($ancien_fichier))
) {
spip_unlink($f);
}
// Changer le statut du document ?
// le statut n'est jamais fixe manuellement mais decoule de celui des objets lies
$champs = collecter_requests(array('parents','ajouts_parents'),array(),$set);
if(document_instituer($id_document,$champs)) {
$champs = collecter_requests(['parents', 'ajouts_parents'], [], $set);
if (document_instituer($id_document, $champs)) {
//
// Post-modifications
//
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='id_document/$id_document'");
suivre_invalideur("id='document/$id_document'");
}
}
/**
* determiner le statut d'un document : prepa/publie
* si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
......@@ -155,68 +169,98 @@ function document_modifier($id_document, $set=false) {
* @param array $champs
* @return bool
*/
function document_instituer($id_document,$champs=array()){
$statut=isset($champs['statut'])?$champs['statut']:null;
$date_publication = isset($champs['date_publication'])?$champs['date_publication']:null;
if (isset($champs['parents']))
medias_revision_document_parents($id_document,$champs['parents']);
if (isset($champs['ajout_parents']))
medias_revision_document_parents($id_document,$champs['ajout_parents'],true);
$row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document");
function document_instituer($id_document, $champs = []) {
$statut = $champs['statut'] ?? null;
$date_publication = $champs['date_publication'] ?? null;
if (isset($champs['parents'])) {
medias_revision_document_parents($id_document, $champs['parents']);
}
if (isset($champs['ajout_parents'])) {
medias_revision_document_parents($id_document, $champs['ajout_parents'], true);
}
$row = sql_fetsel('statut,date_publication', 'spip_documents', 'id_document=' . intval($id_document));
$statut_ancien = $row['statut'];
$date_publication_ancienne = $row['date_publication'];
$champs = [];
/* Autodetermination du statut si non fourni */
if (is_null($statut)){
$statut = 'prepa';
$trouver_table = charger_fonction('trouver_table','base');
$res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document));
// dans 10 ans, ca nous fera un bug a corriger vers 2018
// penser a ouvrir un ticket d'ici la :p
$date_publication=time()+10*365*24*3600;
include_spip('base/objets');
while($row = sql_fetch($res)){
if (
// cas particulier des rubriques qui sont publiees des qu'elles contiennent un document !
$row['objet']=='rubrique'
// ou si objet publie selon sa declaration
OR objet_test_si_publie($row['objet'],$row['id_objet'])){
$statut = 'publie';
$date_publication=0;
continue;
}
// si pas publie, et article, il faut checker la date de post-publi eventuelle
elseif ($row['objet']=='article'
AND $row2 = sql_fetsel('date','spip_articles','id_article='.intval($row['id_objet'])." AND statut='publie'")){
$statut = 'publie';
$date_publication = min($date_publication,strtotime($row2['date']));
}
}
$date_publication = date('Y-m-d H:i:s',$date_publication);
if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publication==$date_publication_ancienne)
return false;
if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0')
if ($statut === null) {
$determiner_statut_document = charger_fonction('determiner_statut_document', 'inc');
$champs = $determiner_statut_document($id_document, $statut_ancien, $date_publication_ancienne);
// rien a faire
if ($champs === false) {
return false;
}
} else {
if ($statut !== $statut_ancien) {
$champs['statut'] = $statut;
}
}
if (
$date_publication !== null && empty($champs['date_publication']) && $date_publication != $date_publication_ancienne
) {
$champs['date_publication'] = $date_publication;
}
if ($statut!==$statut_ancien
OR $date_publication!=$date_publication_ancienne){
sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document));
if ($statut!==$statut_ancien){
$publier_rubriques = sql_allfetsel('id_objet','spip_documents_liens',"objet='rubrique' AND id_document=".intval($id_document));
if (count($publier_rubriques)){
include_spip('inc/rubriques');
foreach($publier_rubriques as $r)
calculer_rubriques_if($r['id_objet'],array('statut'=>$statut),$statut_ancien,false);
// Envoyer aux plugins
$champs = pipeline(
'pre_edition',
[
'args' => [
'table' => 'spip_documents',
'id_objet' => $id_document,
'action' => 'instituer',
'statut_ancien' => $statut_ancien,
'date_ancienne' => $date_publication_ancienne,
],
'data' => $champs,
]
);
if (!(is_countable($champs) ? count($champs) : 0)) {
return false;
}
sql_updateq('spip_documents', $champs, 'id_document=' . intval($id_document));
if (!empty($champs['statut'])) {
$publier_rubriques = sql_allfetsel(
'id_objet',
'spip_documents_liens',
"objet='rubrique' AND id_document=" . intval($id_document)
);
if (is_countable($publier_rubriques) ? count($publier_rubriques) : 0) {
include_spip('inc/rubriques');
foreach ($publier_rubriques as $r) {
calculer_rubriques_if($r['id_objet'], ['statut' => $champs['statut']], $statut_ancien, false);
}
}
return true;
}
return false;
}
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='document/$id_document'");
pipeline(
'post_edition',
[
'args' => [
'table' => 'spip_documents',
'id_objet' => $id_document,
'action' => 'instituer',
'statut_ancien' => $statut_ancien,
'date_ancienne' => $date_publication_ancienne,
],
'data' => $champs,
]
);
return true;
}
/**
* Revision des parents d'un document
......@@ -226,89 +270,57 @@ function document_instituer($id_document,$champs=array()){
* @param array $parents
* @param bool $ajout
*/
function medias_revision_document_parents($id_document, $parents=null, $ajout=false){
if (!is_array($parents))
function medias_revision_document_parents($id_document, $parents = null, $ajout = false) {
include_spip('inc/autoriser');
if (!is_array($parents)) {
return;
$insertions = array();
$objets_parents = array(); // array('article'=>array(12,23))
}
$insertions = [];
$objets_parents = []; // array('article'=>array(12,23))
// au format objet|id_objet
foreach($parents as $p){
$p = explode('|',$p);
if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0])
AND $p[1]=intval($p[1])){ // securite
foreach ($parents as $p) {
$p = explode('|', (string) $p);
if (
preg_match('/^[a-z0-9_]+$/i', $objet = $p[0])
&& (
($p[1] = intval($p[1]))
|| in_array($objet, ['site', 'rubrique'])
)
) { // securite
$objets_parents[$p[0]][] = $p[1];
}
}
include_spip('action/editer_liens');
// les liens actuels
$liens = objet_trouver_liens(array('document'=>$id_document),'*');
$deja_parents = array();
$liens = objet_trouver_liens(['document' => $id_document], '*');
$deja_parents = [];
// si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents
if (!$ajout){
foreach($liens as $k=>$lien)
if (!isset($objets_parents[$lien['objet']]) OR !in_array($lien['id_objet'],$objets_parents[$lien['objet']])) {
objet_dissocier(array('document'=>$id_document),array($lien['objet']=>$lien['id_objet']));
if (!$ajout) {
foreach ($liens as $k => $lien) {
if (!isset($objets_parents[$lien['objet']]) || !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) {
if (autoriser('dissocierdocuments', $lien['objet'], $lien['id_objet'])) {
objet_dissocier(['document' => $id_document], [$lien['objet'] => $lien['id_objet']]);
}
unset($liens[$k]);
} else {
$deja_parents[$lien['objet']][] = $lien['id_objet'];
}
else $deja_parents[$lien['objet']][] = $lien['id_objet'];
}
}
objet_associer(array('document'=>$id_document),$objets_parents);
}
// Fonctions Dépréciées
// --------------------
/**
* Insertion d'un document
*
* @deprecated Utiliser document_inserer()
* @see document_inserer()
* @return int Identifiant du nouveau document
*/
function insert_document() {
return document_inserer();
}
/**
* Modification d'un document
*
* @deprecated Utiliser document_modifier()
* @see document_modifier()
* @param int $id_document Identifiant du document
* @param array|bool $set
*/
function document_set($id_document, $set=false) {
return document_modifier($id_document, $set);
}
/**
* Insituer un document
*
* @deprecated Utiliser document_instituer()
* @see document_instituer()
* @param int $id_document Identifiant du document
* @param array $champs
*/
function instituer_document($id_document,$champs=array()){
return document_instituer($id_document,$champs);
}
/**
* Réviser un document
*
* @deprecated Utiliser document_modifier()
* @see document_modifier()
* @param int $id_document Identifiant du document
* @param array $c
*/
function revision_document($id_document, $c=false) {
return document_modifier($id_document,$c);
// trier les objets à traiter : ne pas prendre en compte ceux qui sont déjà associés ou qu'on n'a pas le droit d'associer
foreach ($objets_parents as $objet => $ids) {
foreach ($ids as $k => $id) {
if (
isset($deja_parents[$objet]) && in_array($id, $deja_parents[$objet]) || !autoriser('associerdocuments', $objet, $id)
) {
unset($objets_parents[$objet][$k]);
}
}
}
objet_associer(['document' => $id_document], $objets_parents);
}
?>
<?php
/**
* 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.
*/
/**
* Gestion de l'API de modification/suppression des logos
*
* @package SPIP\Core\Logo\Edition
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Supprimer le logo d'un objet
*
* @param string $objet
* @param int $id_objet
* @param string $etat
* `on` ou `off`
*/
function logo_supprimer($objet, $id_objet, $etat) {
$chercher_logo = charger_fonction('chercher_logo', 'inc');
$objet = objet_type($objet);
$primary = id_table_objet($objet);
include_spip('inc/chercher_logo');
// existe-t-il deja un logo ?
$logo = $chercher_logo($id_objet, $primary, $etat);
if ($logo) {
# TODO : deprecated, a supprimer -> anciens logos IMG/artonxx.png pas en base
if ((is_countable($logo) ? count($logo) : 0) < 6) {
spip_logger('logo')->info('Supprimer ancien logo ' . json_encode($logo, JSON_THROW_ON_ERROR));
spip_unlink($logo[0]);
} elseif (
($doc = $logo[5])
&& isset($doc['id_document'])
&& ($id_document = $doc['id_document'])
) {
include_spip('action/editer_liens');
// supprimer le lien dans la base
objet_dissocier(['document' => $id_document], [$objet => $id_objet], ['role' => '*']);
// verifier si il reste des liens avec d'autres objets et sinon supprimer
$liens = objet_trouver_liens(['document' => $id_document], '*');
if ($liens === []) {
$supprimer_document = charger_fonction('supprimer_document', 'action');
$supprimer_document($doc['id_document']);
}
}
}
}
/**
* Modifier le logo d'un objet
*
* @param string $objet
* @param int $id_objet
* @param string $etat
* `on` ou `off`
* @param string|array $source
* - array : sous tableau de `$_FILE` issu de l'upload
* - string : fichier source (chemin complet ou chemin relatif a `tmp/upload`)
* @return string
* Erreur, sinon ''
*/
function logo_modifier($objet, $id_objet, $etat, $source) {
$chercher_logo = charger_fonction('chercher_logo', 'inc');
$objet = objet_type($objet);
$primary = id_table_objet($objet);
include_spip('inc/chercher_logo');
$mode = preg_replace(',\W,', '', $etat);
if (!$mode) {
spip_logger('logo')->info("logo_modifier : etat $etat invalide");
return 'etat invalide';
}
// chercher dans la base
$mode_document = 'logo' . $mode;
include_spip('inc/documents');
$erreur = '';
if (!$source) {
spip_logger('logo')->info('spip_image_ajouter : source inconnue');
return 'source inconnue';
}
// fichier dans upload/
if (is_string($source)) {
$tmp_name = false;
if (file_exists($source)) {
$tmp_name = $source;
} elseif (file_exists($f = determine_upload() . $source)) {
$tmp_name = $f;
}
if (!$tmp_name) {
spip_logger('logo')->info('spip_image_ajouter : source inconnue');
return 'source inconnue';
}
$source = [
'tmp_name' => $tmp_name,
'name' => basename($tmp_name),
];
} elseif ($erreur = check_upload_error($source['error'], '', true)) {
return $erreur;
}
// supprimer le logo éventuel existant
// TODO : si un logo existe, le modifier plutot que supprimer + reinserer
// (mais il faut gerer le cas ou il est utilise par plusieurs objets, donc pas si simple)
// mais de toute facon l'interface actuelle oblige a supprimer + reinserer
// @see medias_upgrade_logo_objet()
if (empty($GLOBALS['logo_migrer_en_base'])) {
logo_supprimer($objet, $id_objet, $etat);
}
include_spip('inc/autoriser');
$source['mode'] = $mode_document;
$ajouter_documents = charger_fonction('ajouter_documents', 'action');
autoriser_exception('associerdocuments', $objet, $id_objet);
$ajoutes = $ajouter_documents('new', [$source], $objet, $id_objet, $mode_document);
autoriser_exception('associerdocuments', $objet, $id_objet, false);
$id_document = reset($ajoutes);
if (!is_numeric($id_document)) {
$erreur = ($id_document ?: 'Erreur inconnue');
spip_logger('logo')
->info("Erreur ajout logo : $erreur pour source=" . json_encode($source, JSON_THROW_ON_ERROR));
return $erreur;
}
return ''; // tout est bon, pas d'erreur
}
/**
* Migration des logos en documents.
*
* - avant dans IMG/artonXX.png
* - après dans IMG/logo/... + enregistrés en document dans spip_documents
*
* Cette migration est effectuée à partir de SPIP 4.0
* et la fonction doit être appelée pour chaque plugin qui aurait utilisé des logos
* sur des objets éditoriaux.
*
* @since 4.0
* @deprecated 5.0 Migrer le site & les logos / tables dans un SPIP 4.x ou 5.x
* @param string $objet Type d’objet spip, tel que 'article'
* @param int $time_limit
*/
function logo_migrer_en_base($objet, $time_limit) {
$dir_logos_erreurs = sous_repertoire(_DIR_IMG, 'logo_erreurs');
$dir_logos = sous_repertoire(_DIR_IMG, 'logo');
include_spip('inc/filtres_images_lib_mini');
$formats_logos = _image_extensions_logos(['objet' => $objet]);
$trouver_table = charger_fonction('trouver_table', 'base');
$chercher_logo = charger_fonction('chercher_logo', 'inc');
include_spip('inc/chercher_logo');
$_id_objet = id_table_objet($objet);
$table = table_objet_sql($objet);
$type = type_du_logo($_id_objet);
$desc = $trouver_table($table);
// on desactive les revisions
$liste_objets_versionnes = $GLOBALS['meta']['objets_versions'] ?? '';
unset($GLOBALS['meta']['objets_versions']);
// et le signalement des editions
$articles_modif = $GLOBALS['meta']['articles_modif'] ?? '';
$GLOBALS['meta']['articles_modif'] = 'non';
foreach (['on', 'off'] as $mode) {
$nom_base = $type . $mode;
$dir = (defined('_DIR_LOGOS') ? _DIR_LOGOS : _DIR_IMG);
$files = glob($dir . $nom_base . '*');
// est-ce que c'est une nouvelle tentative de migration ?
// dans ce cas les logos sont deja dans IMG/logo/
if (!(is_countable($files) ? count($files) : 0)) {
$files = glob($dir_logos . $nom_base . '*');
if (is_countable($files) ? count($files) : 0) {
// mais il faut verifier si ils ont pas deja ete migres pour tout ou partie
$filescheck = [];
foreach ($files as $file) {
$short = basename(dirname((string) $file)) . DIRECTORY_SEPARATOR . basename((string) $file);
$filescheck[$short] = $file;
}
// trouver ceux deja migres
$deja = sql_allfetsel(
'fichier',
'spip_documents',
sql_in('fichier', array_keys($filescheck)) . " AND mode LIKE 'logo%'"
);
if (is_countable($deja) ? count($deja) : 0) {
$deja = array_column($deja, 'fichier');
$restant = array_diff(array_keys($filescheck), $deja);
$files = [];
if ($restant !== []) {
foreach ($restant as $r) {
$files[] = $filescheck[$r];
}
}
}
// et si il en reste on peut y aller...
// mais il faut modifier $dir qui sert de base dans la suite
if (is_countable($files) ? count($files) : 0) {
$dir = $dir_logos;
}
}
}
$count = (is_countable($files) ? count($files) : 0);
spip_logger('maj')
->notice("logo_migrer_en_base $objet $mode : " . $count . ' logos restant');
$deja = [];
foreach ($files as $file) {
$logo = substr((string) $file, strlen($dir . $nom_base));
$logo = explode('.', $logo);
if (
is_numeric($logo[0])
&& (($id_objet = (int) $logo[0]) || in_array($objet, ['site', 'rubrique']))
&& !isset($deja[$id_objet])
) {
$logo = $chercher_logo($id_objet, $_id_objet, $mode);
// if no logo in base
if (!$logo || (is_countable($logo) ? count($logo) : 0) < 6) {
foreach ($formats_logos as $format) {
if (@file_exists($d = ($dir . ($nom = $nom_base . (int) $id_objet . '.' . $format)))) {
if (isset($desc['field']['date_modif'])) {
$date_modif = sql_getfetsel('date_modif', $table, "$_id_objet=$id_objet");
} else {
$date_modif = null;
}
// s'assurer que le logo a les bon droits au passage (evite un echec en cas de sanitization d'un svg)
@chmod($d, _SPIP_CHMOD & 0666);
// logo_modifier commence par supprimer le logo existant, donc on le deplace pour pas le perdre
@rename($d, $dir_logos . $nom);
// et on le declare comme nouveau logo
logo_modifier($objet, $id_objet, $mode, $dir_logos . $nom);
if ($date_modif) {
sql_updateq($table, ['date_modif' => $date_modif], "$_id_objet=$id_objet");
}
break;
}
}
}
$deja[$id_objet] = true;
}
// si le fichier est encore la on le move : rien a faire ici
// (sauf si c'est une re-migration : il est deja dans logo/ donc il bouge pas)
if ($dir !== $dir_logos && file_exists($file)) {
@rename($file, $dir_logos_erreurs . basename((string) $file));
}
$count--;
if ($count % 250 === 0) {
spip_logger('maj')->notice("logo_migrer_en_base $objet $mode : " . $count . ' logos restant');
}
if ($time_limit && time() > $time_limit) {
effacer_meta('drapeau_edition');
return;
}
}
}
if ($liste_objets_versionnes) {
$GLOBALS['meta']['objets_versions'] = $liste_objets_versionnes;
}
$GLOBALS['meta']['articles_modif'] = $articles_modif;
effacer_meta('drapeau_edition');
}
/**
* Retourne le type de logo tel que `art` depuis le nom de clé primaire
* de l'objet
*
* C'est par défaut le type d'objet, mais il existe des exceptions historiques
* déclarées par la globale `$table_logos`
*
* @see logo_migrer_en_base()
* @see medias_upgrade_logo_objet()
*
* @param string $_id_objet
* Nom de la clé primaire de l'objet
* @return string
* Type du logo
* @deprecated 4.0 MAIS NE PAS SUPPRIMER CAR SERT POUR L'UPGRADE des logos et leur mise en base
*/
function type_du_logo($_id_objet) {
if ((debug_backtrace(0, 2)[1]['function'] ?? '') !== 'logo_migrer_en_base') {
trigger_deprecation('spip', '4.0', 'Using "%s" is deprecated', __FUNCTION__);
}
$legacy_tables_logos = [
'id_article' => 'art',
'id_auteur' => 'aut',
'id_rubrique' => 'rub',
'id_groupe' => 'groupe',
];
return $legacy_tables_logos[$_id_objet] ?? objet_type(preg_replace(',^id_,', '', $_id_objet));
}
<?php
/**
* Action ordonnant un lien sur une table de liens
*
* @plugin Medias
* @copyright 2017
* @author Matthieu Marcillaud
* @licence GNU/GPL
* @package SPIP\Ordoc\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_ordonner_liens_documents_dist() {
action_ordonner_liens_dist();
}
function action_ordonner_liens_dist() {
include_spip('inc/autoriser');
include_spip('base/objets');
include_spip('action/editer_liens');
// source (table spip_xx_liens)
$objet = objet_type(_request('objet_source'));
// objet lié
$objet_lie = objet_type(_request('objet_lie'));
$id_objet_lie = intval(_request('id_objet_lie'));
// ordre des éléments
$ordre = _request('ordre');
if (!$objet || !$objet_lie || !$id_objet_lie || !$ordre || !is_array($ordre) || !objet_associable($objet)) {
return envoyer_json_erreur(_T('medias:erreur_objet_absent') . ' ' . _T('medias:erreur_deplacement_impossible'));
}
if (!autoriser('modifier', $objet_lie, $id_objet_lie)) {
return envoyer_json_erreur(_T('medias:erreur_autorisation') . ' ' . _T('medias:erreur_deplacement_impossible'));
}
[$_id_objet, $table_liens] = objet_associable($objet);
$success = $errors = [];
$actuels = sql_allfetsel(
[$_id_objet . ' AS id', 'rang_lien'],
$table_liens,
[sql_in($_id_objet, $ordre), 'objet = ' . sql_quote($objet_lie), 'id_objet = ' . sql_quote($id_objet_lie)]
);
$futurs = array_flip($ordre);
// ordre de 1 à n (pas de 0 à n).
array_walk($futurs, function (&$v) {
$v++;
});
$updates = [];
foreach ($actuels as $l) {
if ($futurs[$l['id']] !== $l['rang_lien']) {
$updates[$l['id']] = $futurs[$l['id']];
}
}
if ($updates) {
foreach ($updates as $id => $ordre) {
sql_updateq(
$table_liens,
['rang_lien' => $ordre],
[$_id_objet . ' = ' . $id, 'objet = ' . sql_quote($objet_lie), 'id_objet = ' . sql_quote($id_objet_lie)]
);
}
}
return envoyer_json_envoi([
'done' => true,
'success' => $success,
'errors' => $errors,
]);
}
function envoyer_json_envoi($data) {
header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']);
echo json_encode($data, JSON_THROW_ON_ERROR);
}
function envoyer_json_erreur($msg) {
return envoyer_json_envoi([
'done' => false,
'success' => [],
'errors' => [$msg],
]);
}
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* 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.
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// http://doc.spip.org/@supprimer_document
function action_supprimer_document_dist($id_document=0) {
if (!$id_document){
$securiser_action = charger_fonction('securiser_action','inc');
function action_supprimer_document_dist($id_document = 0) {
if (!$id_document) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_document = $securiser_action();
}
include_spip('inc/autoriser');
if (!autoriser('supprimer','document',$id_document)){
spip_log("Echec : Suppression document $id_document interdite",_LOG_ERREUR);
if (!autoriser('supprimer', 'document', $id_document)) {
spip_log("Echec : Suppression document $id_document interdite", _LOG_ERREUR);
return false;
}
// si c'etait une vignette, modifier le document source !
if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette='.intval($id_document))){
if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette=' . intval($id_document))) {
include_spip('action/editer_document');
document_modifier($source,array("id_vignette" => 0));
document_modifier($source, ['id_vignette' => 0]);
}
include_spip('inc/documents');
if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document='.intval($id_document))){
spip_log("Echec : Suppression document $id_document : le document n'existe pas en base",_LOG_ERREUR);
if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($id_document))) {
spip_log("Echec : Suppression document $id_document : le document n'existe pas en base", _LOG_ERREUR);
return false;
}
spip_log("Suppression du document $id_document (".$doc['fichier'].")");
spip_log("Suppression du document $id_document (" . $doc['fichier'] . ')');
include_spip('action/editer_liens');
// Si c'est un document ayant une vignette, supprimer aussi la vignette
if ($doc['id_vignette']) {
action_supprimer_document_dist($doc['id_vignette']);
objet_dissocier(array('document'=>$doc['id_vignette']),'*');
objet_dissocier(['document' => $doc['id_vignette']], '*');
}
// Si c'est un document ayant des documents annexes (sous-titre, ...)
// les supprimer aussi
$annexes = array_map('reset',sql_allfetsel("id_document","spip_documents_liens","objet='document' AND id_objet=".intval($id_document)));
foreach($annexes as $id){
$annexes = array_column(
sql_allfetsel('id_document', 'spip_documents_liens', "objet='document' AND id_objet=" . intval($id_document)),
'id_document'
);
foreach ($annexes as $id) {
action_supprimer_document_dist($id);
}
// dereferencer dans la base
objet_dissocier(array('document'=>$id_document),'*');
sql_delete('spip_documents', 'id_document='.intval($id_document));
objet_dissocier(['document' => $id_document], '*', ['role' => '*']);
sql_delete('spip_documents', 'id_document=' . intval($id_document));
// Supprimer le fichier si le doc est local,
// et la copie locale si le doc est distant
if ($doc['distant'] == 'oui') {
include_spip('inc/distant');
if ($local = _DIR_RACINE . copie_locale($doc['fichier'],'test'))
if ($local = _DIR_RACINE . copie_locale($doc['fichier'], 'test')) {
spip_unlink($local);
}
else
}
} else {
spip_unlink(get_spip_doc($doc['fichier']));
}
pipeline('post_edition',
array(
'args' => array(
pipeline(
'post_edition',
[
'args' => [
'operation' => 'supprimer_document', // compat v<=2
'action' => 'supprimer_document',
'table' => 'spip_documents',
'id_objet' => $id_document
),
'data' => null
)
'id_objet' => $id_document,
'document' => $doc,
],
'data' => null,
]
);
return true;
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('base/abstract_sql');
function action_supprimer_tous_orphelins() {
$securiser_action = charger_fonction('securiser_action','inc');
$arg = $securiser_action();
//on recupere le contexte pour ne supprimer les orphelins que de ce dernier
list($media,$distant,$statut,$sanstitre) = explode('/',$arg);
//critere sur le media
if($media)
$select = "media=".sql_quote($media);
//critere sur le distant
if($distant)
$where[] = "distant=".sql_quote($distant);
//critere sur le statut
if($statut)
$where[] = "statut REGEXP ".sql_quote("($statut)");
//critere sur le sanstitre
if($sanstitre)
$where[] = "titre=''";
//on isole les orphelins
$select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo");
$cond = "spip_documents.id_document NOT IN ($select)";
$where[] = $cond;
$ids_doc_orphelins = sql_select( "id_document", "spip_documents", $where );
$supprimer_document = charger_fonction('supprimer_document','action');
while ($row = sql_fetch($ids_doc_orphelins)) {
$supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante
}
}
?>
\ No newline at end of file
<?php
/**
* 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.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('base/abstract_sql');
function action_supprimer_tous_orphelins() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
//on recupere le contexte pour ne supprimer les orphelins que de ce dernier
[$media, $distant, $statut, $sanstitre] = explode('/', (string) $arg);
$where = [];
//critere sur le media
if ($media) {
$select = 'media=' . sql_quote($media);
}
//critere sur le distant
if ($distant) {
$where[] = 'distant=' . sql_quote($distant);
}
//critere sur le statut
if ($statut) {
$where[] = 'statut REGEXP ' . sql_quote("($statut)");
}
//critere sur le sanstitre
if ($sanstitre) {
$where[] = "titre=''";
}
//on isole les orphelins
$select = sql_get_select('DISTINCT id_document', 'spip_documents_liens as oooo');
$cond = "spip_documents.id_document NOT IN ($select) AND spip_documents.mode != 'vignette'";
$where[] = $cond;
$ids_doc_orphelins = sql_select('id_document', 'spip_documents', $where);
$supprimer_document = charger_fonction('supprimer_document', 'action');
while ($row = sql_fetch($ids_doc_orphelins)) {
// pour les orphelins du contexte, on traite avec la fonction existante
$supprimer_document($row['id_document']);
}
}
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* 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.
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Tourner un document
*
* http://doc.spip.org/@action_tourner_dist
*
* lorsque les arguments sont passes dans arg en GET :
* id_document-angle
*
* @param int $id_document
* @param int $angle
* angle de rotation en degre>0
* @return void
*/
function action_tourner_dist($id_document=null, $angle=null) {
if (is_null($id_document) OR is_null($angle)){
function action_tourner_dist($id_document = null, $angle = null) {
if ($id_document === null || $angle === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) {
if (!preg_match(',^\W*(\d+)\W?(-?\d+)$,', (string) $arg, $r)) {
spip_log("action_tourner_dist $arg pas compris");
}
else{
} else {
array_shift($r);
list($id_document,$angle) = $r;
[$id_document, $angle] = $r;
}
}
if ($id_document AND autoriser('modifier','document',$id_document))
action_tourner_post($id_document,$angle);
if ($id_document && autoriser('modifier', 'document', $id_document)) {
action_tourner_post($id_document, $angle);
}
}
/**
* Tourner un document
*
* http://doc.spip.org/@action_tourner_post
*
* @param int $id_document
* @param int $angle
* angle de rotation en degre>0
* @return
*/
function action_tourner_post($id_document,$angle)
{
$row = sql_fetsel("fichier,extension", "spip_documents", "id_document=".intval($id_document));
function action_tourner_post($id_document, $angle) {
$row = sql_fetsel('fichier,extension', 'spip_documents', 'id_document=' . intval($id_document));
if (!$row) return;
if (!$row) {
return;
}
include_spip('inc/charsets'); # pour le nom de fichier
include_spip('inc/documents');
include_spip('inc/charsets'); # pour le nom de fichier
include_spip('inc/documents');
// Fichier destination : on essaie toujours de repartir de l'original
$var_rot = $angle;
$effacer = false;
include_spip('inc/distant'); # pour copie_locale
$src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier']));
if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
$effacer = $src;
$src = $match[1].'.'.$match[3];
$src = $match[1] . '.' . $match[3];
$var_rot += intval($match[2]);
}
$var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270
if ($var_rot > 0) {
$dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src);
$dest = preg_replace(',\.[^.]+$,', '-r' . $var_rot . '$0', $src);
spip_log("rotation $var_rot $src : $dest");
include_spip('inc/filtres');
include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0
$res = filtrer('image_rotation',$src,$var_rot);
$res = filtrer('image_format',$res,$row['extension']);
$res = filtrer('image_rotation', $src, $var_rot);
$src = extraire_attribut($res, 'src');
$src = supprimer_timestamp($src);
$src = explode('.', $src);
if (end($src) !== $row['extension']) {
$res = filtrer('image_format', $res, $row['extension']);
}
list($hauteur,$largeur) = taille_image($res);
$res = extraire_attribut($res,'src');
[$hauteur, $largeur] = taille_image($res);
$res = extraire_attribut($res, 'src');
include_spip('inc/getdocument');
deplacer_fichier_upload($res,$dest);
}
else {
deplacer_fichier_upload($res, $dest);
} else {
$dest = $src;
$size_image = @getimagesize($dest);
$size_image = @spip_getimagesize($dest);
$largeur = $size_image[0];
$hauteur = $size_image[1];
}
// succes !
if ($largeur>0 AND $hauteur>0) {
$set = array(
if ($largeur > 0 && $hauteur > 0) {
$set = [
'fichier' => set_spip_doc($dest),
'largeur'=>$largeur, 'hauteur'=>$hauteur,
'distant'=>'non' // le document n'est plus distant apres une transformation
);
if ($taille = @filesize($dest))
'largeur' => $largeur,
'hauteur' => $hauteur,
'distant' => 'non', // le document n'est plus distant apres une transformation
];
if ($taille = @filesize($dest)) {
$set['taille'] = $taille;
sql_updateq('spip_documents', $set, "id_document=".intval($id_document));
}
sql_updateq('spip_documents', $set, 'id_document=' . intval($id_document));
if ($effacer) {
spip_log("rotation : j'efface $effacer");
spip_unlink($effacer);
}
// pipeline pour les plugins
pipeline('post_edition',
array(
'args' => array(
pipeline(
'post_edition',
[
'args' => [
'table' => 'spip_documents',
'table_objet' => 'documents',
'spip_table_objet' => 'spip_documents',
'type' =>'document',
'type' => 'document',
'id_objet' => $id_document,
'champs' => array('rotation'=>$angle,'orientation'=>$var_rot,'fichier'=>$row['fichier']),
'serveur' => $serveur,
'action'=>'tourner',
),
'data' => $set
)
'champs' => [
'rotation' => $angle,
'orientation' => $var_rot,
'fichier' => $row['fichier'],
],
'action' => 'tourner',
],
'data' => $set,
]
);
}
}
// Appliquer l'EXIF orientation
// cf. http://trac.rezo.net/trac/spip/ticket/1494
// http://doc.spip.org/@tourner_selon_exif_orientation
function tourner_selon_exif_orientation($id_document, $fichier) {
if (function_exists('exif_read_data')
AND $exif = exif_read_data($fichier)
AND (
$ort = $exif['IFD0']['Orientation']
OR $ort = $exif['Orientation'])
) {
spip_log("rotation: $ort");
$rot = null;
switch ($ort) {
case 3:
$rot = 180;
case 6:
$rot = 90;
case 8:
$rot = -90;
}
if ($rot)
action_tourner_post(array(null,$id_document, $rot));
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* 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.
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Verifier tous les fichiers brises
*
*/
function action_verifier_documents_brises_dist() {
......@@ -22,14 +22,13 @@ function action_verifier_documents_brises_dist() {
$arg = $securiser_action();
include_spip('inc/autoriser');
if (autoriser('administrer','mediatheque')) {
if (autoriser('voir', '_documents')) {
include_spip('inc/documents');
$res = sql_select('fichier,brise,id_document','spip_documents',"distant='non'");
while ($row = sql_fetch($res)){
if (($brise = !@file_exists(get_spip_doc($row['fichier'])))!=$row['brise'])
sql_updateq('spip_documents',array('brise'=>$brise),'id_document='.intval($row['id_document']));
$res = sql_select('fichier,brise,id_document', 'spip_documents', "distant='non'");
while ($row = sql_fetch($res)) {
if (($brise = !@file_exists(get_spip_doc($row['fichier']))) != $row['brise']) {
sql_updateq('spip_documents', ['brise' => $brise], 'id_document=' . intval($row['id_document']));
}
}
}
}
?>
\ No newline at end of file
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2013 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* 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.
*/
/**
* Gestion de l'action verifier_documents_liens
*
* @package SPIP\Medias\Action
**/
if (!defined("_ECRIRE_INC_VERSION")) return;
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifier tous les fichiers brisés
......@@ -25,17 +25,14 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
* Indique le document cible de l'action, sinon il sera
* obtenu par la clé d'action sécurisée.
*/
function action_verifier_documents_liens_dist($id_document=null) {
function action_verifier_documents_liens_dist($id_document = null) {
if (is_null($id_document)){
if ($id_document === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_document = $securiser_action();
}
$id_document = ($id_document=='*')?'*':intval($id_document);
$id_document = ($id_document == '*') ? '*' : intval($id_document);
include_spip('action/editer_liens');
objet_optimiser_liens(array('document'=>$id_document),'*');
objet_optimiser_liens(['document' => $id_document], '*');
}
?>
<?php
/**
* 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.
*/
/**
* Fonctions génériques pour les balises `#LOGO_XXXX`
*
* @package SPIP\Core\Compilateur\Balises
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compile la balise dynamique `#ID_LOGO_xx` qui retourne l'identifiant du document utilisé comme logo
* pour un objet éditorial de SPIP.
*
* Le type d'objet est récupéré dans le nom de la balise, tel que
* `ID_LOGO_ARTICLE` ou `ID_LOGO_SITE`.
*
* Ces balises ont quelques options :
*
* - La balise peut aussi demander explicitement le logo normal ou de survol,
* avec `ID_LOGO_ARTICLE_NORMAL` ou `ID_LOGO_ARTICLE_SURVOL`.
* - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
* demandé avec `ID_LOGO_ARTICLE_RUBRIQUE`
*
* @balise
* @uses generer_code_logo()
* @example
* ```
* #ID_LOGO_ARTICLE
* ```
*
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @return Spip\Compilateur\Noeud\Champ
* Pile complétée par le code à générer
*/
function balise_ID_LOGO__dist($p) {
preg_match(',^ID_LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
$type = strtolower($regs[1]);
$suite_logo = $regs[2];
// cas de #ID_LOGO_SITE_SPIP
if ($type == 'site_spip') {
$type = 'site';
$_id_objet = "\"'0'\"";
}
$id_objet = id_table_objet($type);
if (!isset($_id_objet)) {
$_id_objet = champ_sql($id_objet, $p);
}
$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
$code = "table_valeur($doc, 'id_vignette')";
} elseif ($connect) {
$code = "''";
spip_logger()
->info('Les logos distants ne sont pas prevus');
} else {
$champ_logo = 'id';
$code = generer_code_logo($id_objet, $_id_objet, $type, '', "''", $p, $suite_logo, $champ_logo);
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}
/**
* Calcule le code HTML pour l'image ou l'information sur un logo
*
* @uses quete_logo()
* @uses quete_html_logo()
*
* @param string $id_objet
* Nom de la clé primaire de l'objet (id_article, ...)
* @param string $_id_objet
* Code pour la compilation permettant de récupérer la valeur de l'identifiant
* @param string $type
* Type d'objet
* @param string $align
* Alignement demandé du logo
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @param string $suite
* Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`.
* @param string $champ
* Indique un type de champ à retourner (fichier, src, titre, descriptif, credits, id, alt)
* @return string
* Code compilé retournant le chemin du logo ou le code HTML du logo.
*/
function generer_code_logo($id_objet, $_id_objet, $type, $align, $_lien, $p, $suite, string $champ = ''): string {
$onoff = 'ON';
$_id_rubrique = "''";
if ($type === 'rubrique') {
$_id_rubrique = "quete_parent($_id_objet)";
}
if ($suite === '_SURVOL') {
$onoff = 'off';
} elseif ($suite === '_NORMAL') {
$onoff = 'on';
} elseif ($suite === '_RUBRIQUE') {
$_id_rubrique = champ_sql('id_rubrique', $p);
}
$code = "quete_logo('$id_objet', '$onoff', $_id_objet, $_id_rubrique)";
if ($champ) {
return "table_valeur($code, '" . addslashes($champ) . "')";
}
$align = preg_replace(',\W,', '', $align);
return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
}