Version in base suite: 4.4.21+dfsg-0+deb13u1 Version in overlay suite: 4.4.23+dfsg-0+deb13u1 Base version: spip_4.4.23+dfsg-0+deb13u1 Target version: spip_4.4.28+dfsg-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/s/spip/spip_4.4.23+dfsg-0+deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/s/spip/spip_4.4.28+dfsg-0+deb13u1.dsc CHANGELOG.md | 20 composer.lock | 165 + debian/changelog | 11 debian/patches/0001-Fix-created-directories-and-files-default-rights.patch | 4 debian/patches/0002-No-next-upstream-version-display-in-private-area.patch | 6 debian/patches/0003-Fix-displayed-version-in-the-private-interface.patch | 4 ecrire/CHANGELOG.md | 91 ecrire/action/activer_plugins.php | 24 ecrire/action/ajouter_lien.php | 25 ecrire/action/annuler_job.php | 23 ecrire/action/api_transmettre.php | 36 ecrire/action/auth.php | 26 ecrire/action/calculer_taille_cache.php | 28 ecrire/action/confirmer_email.php | 22 ecrire/action/confirmer_inscription.php | 10 ecrire/action/converser.php | 13 ecrire/action/cookie.php | 19 ecrire/action/debloquer_edition.php | 20 ecrire/action/desinstaller_plugin.php | 30 ecrire/action/editer_article.php | 78 ecrire/action/editer_auteur.php | 102 - ecrire/action/editer_liens.php | 119 - ecrire/action/editer_logo.php | 39 ecrire/action/editer_objet.php | 119 - ecrire/action/editer_rubrique.php | 54 ecrire/action/etre_webmestre.php | 29 ecrire/action/forcer_job.php | 21 ecrire/action/inscrire_auteur.php | 54 ecrire/action/instituer_langue_objet.php | 21 ecrire/action/instituer_langue_rubrique.php | 40 ecrire/action/instituer_objet.php | 21 ecrire/action/instituer_parent_objet.php | 21 ecrire/action/logout.php | 43 ecrire/action/menu_rubriques.php | 37 ecrire/action/purger.php | 28 ecrire/action/purger_queue.php | 22 ecrire/action/redirect.php | 43 ecrire/action/referencer_traduction.php | 19 ecrire/action/relancer_inscription.php | 21 ecrire/action/session.php | 29 ecrire/action/super_cron.php | 19 ecrire/action/supprimer_lien.php | 25 ecrire/action/supprimer_rubrique.php | 24 ecrire/action/tester.php | 31 ecrire/action/tester_taille.php | 28 ecrire/auth/ldap.php | 51 ecrire/auth/spip.php | 155 - ecrire/balise/formulaire_.php | 75 ecrire/balise/formulaire_admin.php | 78 ecrire/balise/formulaire_ecrire_auteur.php | 33 ecrire/balise/formulaire_inscription.php | 26 ecrire/balise/id_logo_.php | 32 ecrire/balise/info_.php | 25 ecrire/balise/logo_.php | 30 ecrire/balise/menu_lang.php | 29 ecrire/balise/menu_lang_ecrire.php | 37 ecrire/balise/url_.php | 54 ecrire/balise/url_logout.php | 28 ecrire/base/abstract_sql.php | 325 +-- ecrire/base/auxiliaires.php | 21 ecrire/base/connect_sql.php | 110 - ecrire/base/create.php | 55 ecrire/base/delete_all.php | 21 ecrire/base/dump.php | 98 - ecrire/base/objets.php | 367 +-- ecrire/base/repair.php | 33 ecrire/base/serial.php | 21 ecrire/base/trouver_table.php | 51 ecrire/base/upgrade.php | 43 ecrire/charsets/cp1250.php | 9 ecrire/charsets/cp1251.php | 9 ecrire/charsets/cp1256.php | 9 ecrire/charsets/html.php | 13 ecrire/charsets/iso-8859-1.php | 15 ecrire/charsets/iso-8859-15.php | 21 ecrire/charsets/iso-8859-6.php | 25 ecrire/charsets/iso-8859-9.php | 33 ecrire/charsets/mathml.php | 9 ecrire/charsets/translit.php | 31 ecrire/charsets/translitcomplexe.php | 27 ecrire/composer.json | 13 ecrire/exec/403.php | 19 ecrire/exec/404.php | 35 ecrire/exec/admin_plugin.php | 38 ecrire/exec/base_delete_all.php | 21 ecrire/exec/base_repair.php | 20 ecrire/exec/demande_mise_a_jour.php | 24 ecrire/exec/fond.php | 43 ecrire/exec/info_plugin.php | 7 ecrire/exec/informer.php | 21 ecrire/exec/install.php | 26 ecrire/exec/plonger.php | 21 ecrire/exec/puce_statut.php | 33 ecrire/exec/rechercher.php | 40 ecrire/exec/selectionner.php | 22 ecrire/exec/upgrade.php | 25 ecrire/genie/mail.php | 26 ecrire/genie/maintenance.php | 26 ecrire/genie/mise_a_jour.php | 49 ecrire/genie/optimiser.php | 48 ecrire/inc/acces.php | 75 ecrire/inc/actions.php | 14 ecrire/inc/admin.php | 52 ecrire/inc/auth.php | 113 - ecrire/inc/autoriser.php | 382 +-- ecrire/inc/bandeau.php | 78 ecrire/inc/boutons.php | 23 ecrire/inc/charsets.php | 129 - ecrire/inc/chercher_logo.php | 29 ecrire/inc/chercher_rubrique.php | 66 ecrire/inc/commencer_page.php | 38 ecrire/inc/completer_traduction.php | 25 ecrire/inc/config.php | 86 ecrire/inc/cookie.php | 42 ecrire/inc/couleurs.php | 67 ecrire/inc/csv.php | 27 ecrire/inc/cvt_autosave.php | 35 ecrire/inc/cvt_configurer.php | 53 ecrire/inc/cvt_multietapes.php | 87 ecrire/inc/definir_menus_favoris.php | 22 ecrire/inc/distant.php | 246 +- ecrire/inc/documents.php | 93 ecrire/inc/drapeau_edition.php | 48 ecrire/inc/editer.php | 111 - ecrire/inc/email_valide.php | 28 ecrire/inc/envoyer_mail.php | 33 ecrire/inc/exif.php | 3 ecrire/inc/exporter_csv.php | 36 ecrire/inc/filtres.php | 806 +++----- ecrire/inc/filtres_alertes.php | 58 ecrire/inc/filtres_boites.php | 30 ecrire/inc/filtres_dates.php | 224 +- ecrire/inc/filtres_ecrire.php | 65 ecrire/inc/filtres_images_lib_mini.php | 291 +- ecrire/inc/filtres_images_mini.php | 82 ecrire/inc/filtres_mime.php | 44 ecrire/inc/filtres_mini.php | 50 ecrire/inc/filtres_selecteur_generique.php | 28 ecrire/inc/flock.php | 133 - ecrire/inc/genie.php | 32 ecrire/inc/headers.php | 78 ecrire/inc/icone_renommer.php | 27 ecrire/inc/iconifier.php | 27 ecrire/inc/importer_csv.php | 30 ecrire/inc/informer.php | 21 ecrire/inc/install.php | 90 ecrire/inc/invalideur.php | 61 ecrire/inc/journal.php | 23 ecrire/inc/json.php | 26 ecrire/inc/lang.php | 84 ecrire/inc/lang_liste.php | 27 ecrire/inc/layer.php | 24 ecrire/inc/lien.php | 41 ecrire/inc/lien_court.php | 17 ecrire/inc/liens.php | 17 ecrire/inc/lister_objets.php | 23 ecrire/inc/livrer_fichier.php | 49 ecrire/inc/log.php | 48 ecrire/inc/math.php | 28 ecrire/inc/meta.php | 72 ecrire/inc/minipres.php | 23 ecrire/inc/modeles.php | 80 ecrire/inc/modifier.php | 53 ecrire/inc/nfslock.php | 28 ecrire/inc/notifications.php | 32 ecrire/inc/pipelines.php | 62 ecrire/inc/pipelines_ecrire.php | 97 ecrire/inc/plonger.php | 17 ecrire/inc/plugin.php | 275 +- ecrire/inc/precharger_article.php | 27 ecrire/inc/precharger_objet.php | 37 ecrire/inc/prepare_recherche.php | 40 ecrire/inc/preselectionner_parent_nouvel_objet.php | 22 ecrire/inc/presentation.php | 78 ecrire/inc/presentation_mini.php | 62 ecrire/inc/presenter_enfants.php | 23 ecrire/inc/puce_statut.php | 42 ecrire/inc/queue.php | 118 - ecrire/inc/recherche_to_array.php | 68 ecrire/inc/rechercher.php | 76 ecrire/inc/roles.php | 44 ecrire/inc/rubriques.php | 137 - ecrire/inc/securiser_action.php | 66 ecrire/inc/selectionner.php | 28 ecrire/inc/session.php | 107 - ecrire/inc/simplexml_to_array.php | 31 ecrire/inc/surligne.php | 33 ecrire/inc/svg.php | 137 - ecrire/inc/texte.php | 78 ecrire/inc/texte_mini.php | 151 - ecrire/inc/traduire.php | 59 ecrire/inc/urls.php | 134 - ecrire/inc/utils.php | 522 ++--- ecrire/inc/xml.php | 65 ecrire/inc_version.php | 208 -- ecrire/index.php | 45 ecrire/install/etape_.php | 21 ecrire/install/etape_1.php | 28 ecrire/install/etape_2.php | 35 ecrire/install/etape_3.php | 68 ecrire/install/etape_3b.php | 35 ecrire/install/etape_4.php | 20 ecrire/install/etape_chmod.php | 25 ecrire/install/etape_fin.php | 21 ecrire/install/etape_ldap1.php | 40 ecrire/install/etape_ldap2.php | 31 ecrire/install/etape_ldap3.php | 19 ecrire/install/etape_ldap4.php | 24 ecrire/install/etape_ldap5.php | 23 ecrire/iterateur/condition.php | 24 ecrire/iterateur/data.php | 45 ecrire/iterateur/php.php | 25 ecrire/iterateur/pour.php | 23 ecrire/lang/ecrire_fr.php | 1 ecrire/maj/2021.php | 30 ecrire/maj/2026.php | 20 ecrire/maj/legacy/svn10000.php | 19 ecrire/maj/legacy/v21.php | 36 ecrire/maj/legacy/v30.php | 48 ecrire/maj/legacy/v31.php | 29 ecrire/maj/legacy/v32.php | 21 ecrire/maj/legacy/v40.php | 27 ecrire/notifications/instituerarticle.php | 24 ecrire/paquet.xml | 4 ecrire/plugins/afficher_liste.php | 28 ecrire/plugins/afficher_nom_plugin.php | 17 ecrire/plugins/afficher_plugin.php | 48 ecrire/plugins/afficher_repertoires.php | 18 ecrire/plugins/extraire_boutons.php | 22 ecrire/plugins/extraire_pipelines.php | 18 ecrire/plugins/get_infos.php | 43 ecrire/plugins/infos_paquet.php | 44 ecrire/plugins/installer.php | 44 ecrire/plugins/verifie_conformite.php | 31 ecrire/prive.php | 16 ecrire/public.php | 113 - ecrire/public/admin.php | 25 ecrire/public/aiguiller.php | 245 +- ecrire/public/assembler.php | 182 - ecrire/public/balises.php | 362 +-- ecrire/public/boucles.php | 36 ecrire/public/cacher.php | 121 - ecrire/public/compiler.php | 279 +- ecrire/public/composer.php | 209 +- ecrire/public/criteres.php | 425 +--- ecrire/public/debusquer.php | 126 - ecrire/public/decompiler.php | 50 ecrire/public/evaluer_page.php | 40 ecrire/public/fonctions.php | 127 - ecrire/public/format_html.php | 46 ecrire/public/interfaces.php | 112 - ecrire/public/jointures.php | 71 ecrire/public/normaliser.php | 30 ecrire/public/parametrer.php | 90 ecrire/public/phraser_html.php | 168 - ecrire/public/quete.php | 95 ecrire/public/references.php | 119 - ecrire/public/sandbox.php | 32 ecrire/public/styliser.php | 55 ecrire/public/styliser_par_z.php | 128 - ecrire/public/tracer.php | 59 ecrire/req/mysql.php | 204 +- ecrire/req/pg.exp.php | 150 - ecrire/req/sqlite3.php | 20 ecrire/req/sqlite_fonctions.php | 148 - ecrire/req/sqlite_generique.php | 488 +---- ecrire/src/Admin/Bouton.php | 48 ecrire/src/Afficher/Minipage/AbstractPage.php | 44 ecrire/src/Afficher/Minipage/Admin.php | 48 ecrire/src/Afficher/Minipage/Installation.php | 14 ecrire/src/Afficher/Minipage/Page.php | 10 ecrire/src/Chiffrer/Chiffrement.php | 40 ecrire/src/Chiffrer/Cles.php | 27 ecrire/src/Chiffrer/Password.php | 32 ecrire/src/Chiffrer/SpipCles.php | 142 + ecrire/src/Compilateur/Iterateur/AbstractIterateur.php | 9 ecrire/src/Compilateur/Iterateur/Condition.php | 1 ecrire/src/Compilateur/Iterateur/Data.php | 97 ecrire/src/Compilateur/Iterateur/Decorator.php | 87 ecrire/src/Compilateur/Iterateur/Factory.php | 7 ecrire/src/Compilateur/Iterateur/Sql.php | 12 ecrire/src/Compilateur/Noeud/Boucle.php | 52 ecrire/src/Compilateur/Noeud/Champ.php | 36 ecrire/src/Compilateur/Noeud/Contexte.php | 16 ecrire/src/Compilateur/Noeud/Critere.php | 31 ecrire/src/Compilateur/Noeud/Idiome.php | 41 ecrire/src/Compilateur/Noeud/Inclure.php | 14 ecrire/src/Compilateur/Noeud/Polyglotte.php | 10 ecrire/src/Compilateur/Noeud/Texte.php | 14 ecrire/src/Css/Vars/Collection.php | 4 ecrire/src/Debug/Context.php | 149 + ecrire/src/ErrorHandler.php | 10 ecrire/src/I18n/Description.php | 32 ecrire/src/Sql/Sqlite/PDOStatement.php | 4 ecrire/src/Sql/Sqlite/Requeteur.php | 62 ecrire/src/Sql/Sqlite/Sqlite.php | 69 ecrire/src/Sql/Sqlite/Traducteur.php | 78 ecrire/src/Texte/Collecteur/AbstractCollecteur.php | 16 ecrire/src/Texte/Collecteur/HtmlPhp.php | 37 ecrire/src/Texte/Collecteur/HtmlTag.php | 73 ecrire/src/Texte/Collecteur/Idiomes.php | 12 ecrire/src/Texte/Collecteur/Liens.php | 18 ecrire/src/Texte/Collecteur/Modeles.php | 128 - ecrire/src/Texte/Collecteur/Multis.php | 25 ecrire/src/Texte/Collecteur/QuotedStrings.php | 128 + ecrire/typographie/en.php | 25 ecrire/typographie/fr.php | 38 ecrire/urls/page.php | 34 ecrire/xml/analyser_dtd.php | 53 ecrire/xml/indenter.php | 33 ecrire/xml/interfaces.php | 28 ecrire/xml/sax.php | 39 ecrire/xml/valider.php | 76 plugins-dist.json | 20 plugins-dist/forum/.editorconfig | 2 plugins-dist/forum/CHANGELOG.md | 17 plugins-dist/forum/base/forum.php | 29 plugins-dist/forum/formulaires/forum.php | 9 plugins-dist/forum/formulaires/forum_prive.php | 7 plugins-dist/forum/formulaires/inc-forum_previsu.html | 2 plugins-dist/forum/formulaires/inc-forum_prive_previsu.html | 2 plugins-dist/forum/formulaires/inc-login_forum.html | 4 plugins-dist/forum/formulaires/inc-login_forum_abo.html | 4 plugins-dist/forum/forum_fonctions.php | 61 plugins-dist/forum/forum_pipelines.php | 8 plugins-dist/forum/inc/forum.php | 31 plugins-dist/forum/paquet.xml | 2 plugins-dist/forum/phpstan-baseline.neon | 22 plugins-dist/forum/prive/objets/liste/forums.html | 6 plugins-dist/forum/prive/objets/liste/participer_forum.html | 8 plugins-dist/forum/prive/objets/liste/participer_forum_thread.html | 6 plugins-dist/forum/prive/squelettes/contenu/controler_forum.html | 14 plugins-dist/forum/prive/transmettre/rss/forums_public.html | 5 plugins-dist/forum/prive/transmettre/rss/forums_vide.html | 5 plugins-dist/forum/rss_forum_article.html | 4 plugins-dist/forum/rss_forum_breve.html | 4 plugins-dist/forum/rss_forum_rubrique.html | 4 plugins-dist/forum/rss_forum_thread.html | 4 plugins-dist/medias/.editorconfig | 2 plugins-dist/medias/CHANGELOG.md | 18 plugins-dist/medias/action/acceder_document.php | 2 plugins-dist/medias/action/ajouter_documents.php | 33 plugins-dist/medias/action/editer_document.php | 3 plugins-dist/medias/formulaires/editer_document.php | 3 plugins-dist/medias/formulaires/illustrer_document.php | 10 plugins-dist/medias/formulaires/joindre_document.php | 19 plugins-dist/medias/inc/documents.php | 22 plugins-dist/medias/inc/renseigner_document.php | 17 plugins-dist/medias/lib/getid3/getid3.lib.php | 8 plugins-dist/medias/lib/getid3/getid3.php | 45 plugins-dist/medias/lib/getid3/module.audio-video.isobmff.php | 294 +++ plugins-dist/medias/lib/getid3/module.audio-video.quicktime.php | 11 plugins-dist/medias/lib/getid3/module.audio-video.riff.php | 7 plugins-dist/medias/lib/getid3/module.audio.mp3.php | 1 plugins-dist/medias/lib/getid3/module.audio.shorten.php | 4 plugins-dist/medias/lib/getid3/module.graphic.jpegxl.php | 971 ++++++++++ plugins-dist/medias/lib/getid3/module.tag.apetag.php | 26 plugins-dist/medias/lib/getid3/module.tag.id3v2.php | 13 plugins-dist/medias/lib/getid3/module.tag.lyrics3.php | 5 plugins-dist/medias/lib/getid3/write.metaflac.php | 6 plugins-dist/medias/lib/getid3/write.vorbiscomment.php | 6 plugins-dist/medias/medias_autoriser.php | 33 plugins-dist/medias/modeles/file_emb_text.html | 4 plugins-dist/medias/modeles/file_emb_text_csv.html | 4 plugins-dist/medias/paquet.xml | 2 plugins-dist/porte_plume/.editorconfig | 2 plugins-dist/porte_plume/CHANGELOG.md | 10 plugins-dist/porte_plume/paquet.xml | 2 plugins-dist/porte_plume/porte_plume_fonctions.php | 95 plugins-dist/revisions/CHANGELOG.md | 6 plugins-dist/revisions/afficher_diff/jointure.php | 7 plugins-dist/revisions/paquet.xml | 2 plugins-dist/revisions/prive/objets/liste/versions.html | 6 plugins-dist/revisions/prive/squelettes/contenu/revision.html | 6 plugins-dist/safehtml/.editorconfig | 2 plugins-dist/safehtml/CHANGELOG.md | 18 plugins-dist/safehtml/inc/safehtml.php | 3 plugins-dist/safehtml/paquet.xml | 2 plugins-dist/safehtml/phpstan-baseline.neon | 12 plugins-dist/safehtml/sanitizer/html.php | 182 + plugins-dist/safehtml/sanitizer/svg.php | 37 plugins-dist/sites/CHANGELOG.md | 12 plugins-dist/sites/inc/site.php | 4 plugins-dist/sites/paquet.xml | 2 plugins-dist/sites/syndic/atomrss.php | 2 plugins-dist/statistiques/.editorconfig | 2 plugins-dist/statistiques/.gitattributes | 1 plugins-dist/statistiques/.gitlab-ci.yml | 35 plugins-dist/statistiques/CHANGELOG.md | 15 plugins-dist/statistiques/action/statistiques_archiver.php | 8 plugins-dist/statistiques/composer.json | 7 plugins-dist/statistiques/genie/visites.php | 114 - plugins-dist/statistiques/inc/referenceurs.php | 14 plugins-dist/statistiques/inc/stats_referers_to_array.php | 26 plugins-dist/statistiques/paquet.xml | 4 plugins-dist/statistiques/phpunit.xml.dist | 39 plugins-dist/statistiques/prive/bouton/statistiques.html | 2 plugins-dist/statistiques/prive/squelettes/contenu/stats_referers.html | 12 plugins-dist/statistiques/prive/squelettes/contenu/stats_repartition_fonctions.php | 14 plugins-dist/statistiques/prive/squelettes/inclure/stats-visites-data.html | 8 plugins-dist/statistiques/prive/squelettes/inclure/stats-visites-jours-resume.html | 6 plugins-dist/statistiques/prive/squelettes/inclure/stats-visites-jours.html | 6 plugins-dist/statistiques/prive/squelettes/inclure/stats-visites-populaires.html | 8 plugins-dist/statistiques/public/stats.php | 62 plugins-dist/statistiques/stats_administrations.php | 27 plugins-dist/statistiques/tests/StatsNettoyerRefererTest.php | 288 ++ plugins-dist/statistiques/tests/StatsRefererValideTest.php | 134 + plugins-dist/statistiques/tests/StatsValiderRefererTest.php | 223 ++ plugins-dist/svp/.editorconfig | 2 plugins-dist/svp/CHANGELOG.md | 7 plugins-dist/svp/action/actionner.php | 2 plugins-dist/svp/formulaires/admin_plugin.php | 41 plugins-dist/svp/formulaires/charger_plugin.php | 42 plugins-dist/svp/formulaires/inc-confirmer_actions.html | 12 plugins-dist/svp/inc/svp_decider.php | 2 plugins-dist/svp/paquet.xml | 2 plugins-dist/textwheel/CHANGELOG.md | 13 plugins-dist/textwheel/inc/lien.php | 4 plugins-dist/textwheel/inc/notes.php | 14 plugins-dist/textwheel/inc/texte.php | 84 plugins-dist/textwheel/paquet.xml | 2 plugins-dist/textwheel/wheels/spip/echappe-js.json | 8 plugins-dist/textwheel/wheels/spip/echappe-js.yaml | 30 plugins-dist/textwheel/wheels/spip/interdire-scripts.json | 2 plugins-dist/textwheel/wheels/spip/interdire-scripts.yaml | 4 plugins-dist/urls_etendues/.editorconfig | 2 plugins-dist/urls_etendues/CHANGELOG.md | 6 plugins-dist/urls_etendues/paquet.xml | 2 plugins-dist/urls_etendues/urls/arbo.php | 97 prive/CHANGELOG.md | 17 prive/ajax_selecteur_fonctions.php | 16 prive/composer.json | 21 prive/echafaudage/hierarchie/objet_fonctions.php | 22 prive/formulaires/configurer_annonces.php | 20 prive/formulaires/configurer_articles.php | 19 prive/formulaires/configurer_avertisseur.php | 19 prive/formulaires/configurer_ecran_connexion.php | 18 prive/formulaires/configurer_flux.php | 21 prive/formulaires/configurer_identite.php | 18 prive/formulaires/configurer_langage.php | 26 prive/formulaires/configurer_langue.php | 17 prive/formulaires/configurer_logos.php | 21 prive/formulaires/configurer_multilinguisme.php | 32 prive/formulaires/configurer_preferences.php | 22 prive/formulaires/configurer_preferences_menus.php | 24 prive/formulaires/configurer_previsualiseur.php | 17 prive/formulaires/configurer_redacteurs.php | 19 prive/formulaires/configurer_reducteur.php | 41 prive/formulaires/configurer_relayeur.php | 29 prive/formulaires/configurer_rubriques.php | 23 prive/formulaires/configurer_transcodeur.php | 19 prive/formulaires/configurer_visiteurs.php | 21 prive/formulaires/dater.php | 69 prive/formulaires/declarer_bases.php | 36 prive/formulaires/editer_article.php | 30 prive/formulaires/editer_auteur.html | 24 prive/formulaires/editer_auteur.php | 152 - prive/formulaires/editer_liens.php | 110 - prive/formulaires/editer_logo.php | 41 prive/formulaires/editer_rubrique.php | 31 prive/formulaires/inc-instituer_auteur.html | 1 prive/formulaires/inc-instituer_auteur_fonctions.php | 2 prive/formulaires/inscription.php | 44 prive/formulaires/instituer_objet.php | 30 prive/formulaires/login.php | 83 prive/formulaires/mot_de_passe.php | 70 prive/formulaires/oubli.php | 44 prive/formulaires/recherche_ecrire.php | 20 prive/formulaires/rediriger_article.php | 24 prive/formulaires/traduire.php | 39 prive/informer_auteur_fonctions.php | 19 prive/javascript/js.cookie.js | 27 prive/objets/liste/articles_fonctions.php | 20 prive/objets/liste/auteurs_associer_fonctions.php | 16 prive/objets/liste/auteurs_fonctions.php | 54 prive/objets/liste/auteurs_lies_fonctions.php | 16 prive/objets/liste/objets-en-edition_fonctions.php | 16 prive/objets/liste/objets-trad_fonctions.php | 16 prive/objets/liste/visiteurs_fonctions.php | 16 prive/squelettes/ajax.html | 3 prive/squelettes/contenu/job_queue_fonctions.php | 8 prive/themes/spip/vars.css_fonctions.php | 5 vendor/composer/autoload_files.php | 2 vendor/composer/autoload_static.php | 2 vendor/composer/installed.json | 183 + vendor/composer/installed.php | 66 vendor/jakeasmith/http_build_url/.travis.yml | 13 vendor/jakeasmith/http_build_url/composer.json | 6 vendor/jakeasmith/http_build_url/readme.md | 46 vendor/symfony/polyfill-mbstring/Mbstring.php | 756 ++++++- vendor/symfony/polyfill-php80/PhpToken.php | 10 vendor/symfony/polyfill-php82/Php82.php | 63 vendor/symfony/polyfill-php83/Php83.php | 98 - vendor/symfony/polyfill-php84/Php84.php | 123 + vendor/symfony/polyfill-php84/bootstrap.php | 2 vendor/symfony/polyfill-php85/Php85.php | 91 vendor/symfony/polyfill-php85/bootstrap.php | 2 vendor/symfony/polyfill-php85/bootstrap80.php | 2 498 files changed, 14294 insertions(+), 11908 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp3a6wmzyq/spip_4.4.23+dfsg-0+deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp3a6wmzyq/spip_4.4.28+dfsg-0+deb13u1.dsc: no acceptable signature found diff -Nru spip-4.4.23+dfsg/CHANGELOG.md spip-4.4.28+dfsg/CHANGELOG.md --- spip-4.4.23+dfsg/CHANGELOG.md 2026-09-02 12:02:52.000000000 +0000 +++ spip-4.4.28+dfsg/CHANGELOG.md 2026-10-07 13:48:22.000000000 +0000 @@ -1,5 +1,25 @@ # Changelog +## 4.4.28 - 2026-10-07 + +- Mise à jour des dépendances (ecrire, safehtml) + +## 4.4.27 - 2026-10-06 + +- Mise à jour des dépendances (ecrire) + +## 4.4.26 - 2026-10-06 + +- Mise à jour des dépendances (ecrire, prive, forum, medias, porte-plume, revisions, safehtml, sites, stats, svp, tw) + +## 4.4.25 - 2026-09-25 + +- Mise à jour des dépendances (ecrire, sites) + +## 4.4.24 - 2026-09-22 + +- Mise à jour des dépendances (ecrire, prive, forum, medias, urls) + ## 4.4.23 - 2026-09-02 - Mise à jour des dépendances (ecrire, prive, bigup, forum, medias) diff -Nru spip-4.4.23+dfsg/composer.lock spip-4.4.28+dfsg/composer.lock --- spip-4.4.23+dfsg/composer.lock 2026-09-02 12:02:52.000000000 +0000 +++ spip-4.4.28+dfsg/composer.lock 2026-10-07 13:48:22.000000000 +0000 @@ -64,16 +64,16 @@ }, { "name": "jakeasmith/http_build_url", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/jakeasmith/http_build_url.git", - "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37" + "reference": "18627808c80621219f80337fa4adcee7a31aff7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37", - "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/18627808c80621219f80337fa4adcee7a31aff7d", + "reference": "18627808c80621219f80337fa4adcee7a31aff7d", "shasum": "" }, "type": "library", @@ -89,15 +89,17 @@ "authors": [ { "name": "Jake A. Smith", - "email": "theman@jakeasmith.com" + "email": "theman@jakeasmith.com", + "homepage": "https://jakeasmith.com" } ], - "description": "Provides functionality for http_build_url() to environments without pecl_http.", + "description": "Deprecated: use PHP 8.5's built-in Uri\\Rfc3986\\Uri instead. Provides http_build_url() for environments without pecl_http.", "support": { "issues": "https://github.com/jakeasmith/http_build_url/issues", "source": "https://github.com/jakeasmith/http_build_url" }, - "time": "2017-05-01T15:36:40+00:00" + "abandoned": true, + "time": "2026-09-15T07:48:37+00:00" }, { "name": "psr/container", @@ -317,16 +319,16 @@ }, { "name": "spip/ecrire", - "version": "4.4.23", + "version": "4.4.28", "source": { "type": "git", "url": "https://git.spip.net/spip/ecrire.git", - "reference": "f315d717675c54ad2c84411bb8c2d3c26297a0b5" + "reference": "c313201ded053f6f3d08f7867e62c740ba315540" }, "dist": { "type": "zip", - "url": "https://git.spip.net/api/v4/projects/spip%2Fecrire/repository/archive.zip?sha=f315d717675c54ad2c84411bb8c2d3c26297a0b5", - "reference": "f315d717675c54ad2c84411bb8c2d3c26297a0b5", + "url": "https://git.spip.net/api/v4/projects/spip%2Fecrire/repository/archive.zip?sha=c313201ded053f6f3d08f7867e62c740ba315540", + "reference": "c313201ded053f6f3d08f7867e62c740ba315540", "shasum": "" }, "require": { @@ -343,10 +345,11 @@ "symfony/polyfill-php81": "^1.31", "symfony/polyfill-php82": "^1.31", "symfony/polyfill-php83": "^1.31", - "symfony/polyfill-php84": "^1.31" + "symfony/polyfill-php84": "^1.31", + "symfony/polyfill-php85": "^1.31" }, "require-dev": { - "symplify/easy-coding-standard": "^12.3" + "spip-league/qa-tools": "^1.0" }, "type": "spip-ecrire", "autoload": { @@ -357,43 +360,89 @@ "bootstrap/deprecations.php" ] }, + "scripts": { + "analyse": [ + "phpstan --memory-limit=1G" + ], + "baseline": [ + "phpstan --memory-limit=1G --generate-baseline --allow-empty-baseline" + ], + "check-cs": [ + "ecs check --ansi" + ], + "fix-cs": [ + "ecs check --fix --ansi" + ], + "rector": [ + "rector process --ansi" + ], + "rector-dry-run": [ + "rector process --dry-run --ansi" + ] + }, "license": [ "GPL-3.0-only" ], "description": "Noyau de SPIP", "support": { - "source": "https://git.spip.net/spip/ecrire/-/tree/4.4.23", + "source": "https://git.spip.net/spip/ecrire/-/tree/4.4.28", "issues": "https://git.spip.net/spip/ecrire/-/issues" }, - "time": "2026-09-02T13:56:18+02:00" + "time": "2026-10-07T15:47:13+02:00" }, { "name": "spip/prive", - "version": "1.1.5", + "version": "1.1.7", "source": { "type": "git", "url": "https://git.spip.net/spip/prive.git", - "reference": "7ed90bbcf72fc33213bc0257bc3e805bd6c5a067" + "reference": "b68902b53cb29ac8d3ec7c3b12c5e43b23281c40" }, "dist": { "type": "zip", - "url": "https://git.spip.net/api/v4/projects/spip%2Fprive/repository/archive.zip?sha=7ed90bbcf72fc33213bc0257bc3e805bd6c5a067", - "reference": "7ed90bbcf72fc33213bc0257bc3e805bd6c5a067", + "url": "https://git.spip.net/api/v4/projects/spip%2Fprive/repository/archive.zip?sha=b68902b53cb29ac8d3ec7c3b12c5e43b23281c40", + "reference": "b68902b53cb29ac8d3ec7c3b12c5e43b23281c40", "shasum": "" }, "require-dev": { - "spip-league/kernel": "^1.x-dev" + "spip-league/kernel": "1.x-dev", + "spip-league/sdk": "^1.1" }, "type": "spip-prive", + "autoload-dev": { + "files": [ + "vendor/spip-league/sdk/src/Stub/functions.php" + ] + }, + "scripts": { + "analyse": [ + "phpstan --memory-limit=1G" + ], + "baseline": [ + "phpstan --memory-limit=1G --generate-baseline --allow-empty-baseline" + ], + "check-cs": [ + "ecs check --ansi" + ], + "fix-cs": [ + "ecs check --fix --ansi" + ], + "rector": [ + "rector process --ansi" + ], + "rector-dry-run": [ + "rector process --dry-run --ansi" + ] + }, "license": [ "GPL-3.0-only" ], "description": "Squelettes de l'espace privé", "support": { - "source": "https://git.spip.net/spip/prive/-/tree/1.1.5", + "source": "https://git.spip.net/spip/prive/-/tree/1.1.7", "issues": "https://git.spip.net/spip/prive/-/issues" }, - "time": "2026-09-02T13:45:16+02:00" + "time": "2026-10-06T11:58:29+02:00" }, { "name": "spip/security", @@ -745,16 +794,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.38.2", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { @@ -806,7 +855,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -826,20 +875,20 @@ "type": "tidelift" } ], - "time": "2026-05-27T06:59:30+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.37.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", - "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74", + "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74", "shasum": "" }, "require": { @@ -890,7 +939,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.43.0" }, "funding": [ { @@ -910,7 +959,7 @@ "type": "tidelift" } ], - "time": "2026-04-10T16:19:22+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/polyfill-php81", @@ -994,16 +1043,16 @@ }, { "name": "symfony/polyfill-php82", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b" + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/843bbe8b2a7934307b749751eede0f111f5d1cfc", + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc", "shasum": "" }, "require": { @@ -1050,7 +1099,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.43.0" }, "funding": [ { @@ -1070,20 +1119,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:45:58+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/80ccff923a8d61f73ebe9da0aa94e25232f004ce", + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce", "shasum": "" }, "require": { @@ -1130,7 +1179,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.43.0" }, "funding": [ { @@ -1150,20 +1199,20 @@ "type": "tidelift" } ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/22c6548499cbe5c5bb072fc0c42312dff062a015", + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015", "shasum": "" }, "require": { @@ -1210,7 +1259,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.43.0" }, "funding": [ { @@ -1230,20 +1279,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:51:13+00:00" + "time": "2026-09-23T22:01:09+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/86a42cbcc07adc331481a5ab310a4024bfc227f6", + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6", "shasum": "" }, "require": { @@ -1290,7 +1339,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.43.0" }, "funding": [ { @@ -1310,7 +1359,7 @@ "type": "tidelift" } ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/service-contracts", diff -Nru spip-4.4.23+dfsg/debian/changelog spip-4.4.28+dfsg/debian/changelog --- spip-4.4.23+dfsg/debian/changelog 2026-09-03 05:41:44.000000000 +0000 +++ spip-4.4.28+dfsg/debian/changelog 2026-10-08 17:15:42.000000000 +0000 @@ -1,3 +1,14 @@ +spip (4.4.28+dfsg-0+deb13u1) trixie-security; urgency=medium + + [ Matthieu Marcillaud ] + * build: up dependencies + * build: Version 4.4.28 + + [ David Prévot ] + * Refresh patches + + -- David Prévot Thu, 08 Oct 2026 19:15:42 +0200 + spip (4.4.23+dfsg-0+deb13u1) trixie-security; urgency=medium [ David Prévot ] diff -Nru spip-4.4.23+dfsg/debian/patches/0001-Fix-created-directories-and-files-default-rights.patch spip-4.4.28+dfsg/debian/patches/0001-Fix-created-directories-and-files-default-rights.patch --- spip-4.4.23+dfsg/debian/patches/0001-Fix-created-directories-and-files-default-rights.patch 2026-09-03 05:41:32.000000000 +0000 +++ spip-4.4.28+dfsg/debian/patches/0001-Fix-created-directories-and-files-default-rights.patch 2026-10-08 17:14:45.000000000 +0000 @@ -13,10 +13,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php -index 2de3d9c..afec1cb 100644 +index 7405d1a..aea3d46 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php -@@ -445,7 +445,7 @@ $liste_des_authentifications = [ +@@ -443,7 +443,7 @@ $liste_des_authentifications = [ # $table_des_traitements['TITRE'][]= 'typo(supprimer_numero(%s), "TYPO", $connect)'; // Droits d'acces maximum par defaut diff -Nru spip-4.4.23+dfsg/debian/patches/0002-No-next-upstream-version-display-in-private-area.patch spip-4.4.28+dfsg/debian/patches/0002-No-next-upstream-version-display-in-private-area.patch --- spip-4.4.23+dfsg/debian/patches/0002-No-next-upstream-version-display-in-private-area.patch 2026-09-03 05:33:38.000000000 +0000 +++ spip-4.4.28+dfsg/debian/patches/0002-No-next-upstream-version-display-in-private-area.patch 2026-10-08 17:14:45.000000000 +0000 @@ -11,11 +11,11 @@ 1 file changed, 2 insertions(+) diff --git a/ecrire/inc/presentation_mini.php b/ecrire/inc/presentation_mini.php -index 02d3485..6f5ca21 100644 +index dba717e..c09f194 100644 --- a/ecrire/inc/presentation_mini.php +++ b/ecrire/inc/presentation_mini.php -@@ -198,6 +198,8 @@ function html_tests_js() { - **/ +@@ -190,6 +190,8 @@ function html_tests_js() { + */ function info_maj_spip() { + return ''; diff -Nru spip-4.4.23+dfsg/debian/patches/0003-Fix-displayed-version-in-the-private-interface.patch spip-4.4.28+dfsg/debian/patches/0003-Fix-displayed-version-in-the-private-interface.patch --- spip-4.4.23+dfsg/debian/patches/0003-Fix-displayed-version-in-the-private-interface.patch 2026-09-03 05:41:32.000000000 +0000 +++ spip-4.4.28+dfsg/debian/patches/0003-Fix-displayed-version-in-the-private-interface.patch 2026-10-08 17:14:45.000000000 +0000 @@ -14,10 +14,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php -index afec1cb..950d443 100644 +index aea3d46..4f73442 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php -@@ -470,7 +470,7 @@ $spip_sql_version = 1; +@@ -468,7 +468,7 @@ $spip_sql_version = 1; // version de spip en chaine // 1.xxyy : xx00 versions stables publiees, xxyy versions de dev // (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne) diff -Nru spip-4.4.23+dfsg/ecrire/CHANGELOG.md spip-4.4.28+dfsg/ecrire/CHANGELOG.md --- spip-4.4.23+dfsg/ecrire/CHANGELOG.md 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/CHANGELOG.md 2026-10-07 13:48:22.000000000 +0000 @@ -2,6 +2,97 @@ Changelog de SPIP 4.4 +## 4.4.28 - 2026-10-07 + +### Fixed + +- !413 quand la redirection est fixée par l'action, il ne faut la sanitizer, elle est de confiance +- #193 Accélérer la maj de réinitialisation des vieux password +- #192 reduire le niveau de log (en debug) de lecture des clés +- #191 renforcer la clé d'hébergement quand phpinfo() est désactivée + +## 4.4.27 - 2026-10-06 + +### Fixed + +- Collecteur QuotedStrings: en contexte Sqlite `'\'` est une chaine bien formée (les guillemets sont echappés par un `''` et pas un `\'`) + +## 4.4.26 - 2026-10-06 + +### Security + +- spip-security/securite#4948 interdire l'affichage direct des squelettes `formulaires/` même pour les webmestres +- spip-security/securite#4934 reinitialiser les vieux mots de passe en md5 des redacteurs et des administrateurs +- spip-security/securite#4940 Masquer les valeurs sensibles dans les logs et le debug +- spip-security/securite#4952 débuggueur: echapper la requete affichee dans le `
`
+- spip-security/securite#4952 echappement des attributs dans le debuggueur
+- spip-security/securite#4947 redirige_formulaire est moins laxiste avec la mise en forme des urls
+- spip-security/securite#4938 ne jamais utiliser redirige_par_entete() dans une action
+- spip-security/securite#4928 `|balise_svg` fait appel au sanitizer svg avant tout affichage
+- spip-security/securite#4927 la `copie_locale()` abandonne si la sanitization du fichier echoue
+- spip-security/securite#4927 support des svg avec une balise ` $ids], [$objet_lie => $idl], [$qualif => $valeur_qualif ]);
+		objet_associer([$objet_source => $ids], [$objet_lie => $idl], [$qualif => $valeur_qualif]);
 	} else {
 		[$objet_source, $ids, $objet_lie, $idl] = $args;
 		objet_associer([$objet_source => $ids], [$objet_lie => $idl]);
diff -Nru spip-4.4.23+dfsg/ecrire/action/annuler_job.php spip-4.4.28+dfsg/ecrire/action/annuler_job.php
--- spip-4.4.23+dfsg/ecrire/action/annuler_job.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/annuler_job.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,28 +1,23 @@
  joli_repertoire(_DIR_VAR),
-				'taille' => '' . (taille_en_octets($taille) > 0 ? taille_en_octets($taille) : '0 octet') . ''
+				'taille' => '' . (taille_en_octets($taille) > 0 ? taille_en_octets($taille) : '0 octet') . '',
 			]
 		);
 	} else {
@@ -67,7 +64,6 @@
 	ajax_retour($res);
 }
 
-
 /**
  * Calculer la taille d'un dossier, sous dossiers inclus
  *
@@ -75,7 +71,7 @@
  * @return int Taille en octets
  */
 function calculer_taille_dossier($dir) {
-	if (!is_dir($dir) or !is_readable($dir)) {
+	if (!is_dir($dir) || !is_readable($dir)) {
 		return 0;
 	}
 	$handle = opendir($dir);
diff -Nru spip-4.4.23+dfsg/ecrire/action/confirmer_email.php spip-4.4.28+dfsg/ecrire/action/confirmer_email.php
--- spip-4.4.23+dfsg/ecrire/action/confirmer_email.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/confirmer_email.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
  $arg]);
 	}
diff -Nru spip-4.4.23+dfsg/ecrire/action/confirmer_inscription.php spip-4.4.28+dfsg/ecrire/action/confirmer_inscription.php
--- spip-4.4.23+dfsg/ecrire/action/confirmer_inscription.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/confirmer_inscription.php	2026-10-07 13:48:22.000000000 +0000
@@ -13,10 +13,7 @@
 
 /**
  * Gestion de l'action confirmer_inscription
- *
- * @package SPIP\Core\Inscription
  */
-
 if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
@@ -26,7 +23,6 @@
  *
  * @global array $GLOBALS ['visiteur_session']
  * @global string $GLOBALS ['redirect']
- * @return void
  */
 function action_confirmer_inscription_dist() {
 	$jeton = _request('jeton');
@@ -34,9 +30,9 @@
 
 	include_spip('action/inscrire_auteur');
 	if (
-		$auteur = auteur_verifier_jeton($jeton)
-		and $auteur['email'] == $email
-		and $auteur['statut'] == 'nouveau'
+		($auteur = auteur_verifier_jeton($jeton))
+		&& $auteur['email'] == $email
+		&& $auteur['statut'] == 'nouveau'
 	) {
 		// d'abord on confirme son statut
 		$auteur = confirmer_statut_inscription($auteur);
diff -Nru spip-4.4.23+dfsg/ecrire/action/converser.php spip-4.4.28+dfsg/ecrire/action/converser.php
--- spip-4.4.23+dfsg/ecrire/action/converser.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/converser.php	2026-10-07 13:48:22.000000000 +0000
@@ -13,9 +13,7 @@
 
 /**
  * Gestion de l'action converser qui permet changer de langue
- *
- * @package SPIP\Core\Langue
- **/
+ */
 if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
@@ -27,25 +25,23 @@
  *
  * Pas de secu si espace public ou login ou installation
  * mais alors on n'accède pas à la base, on pose seulement le cookie.
- *
- * @return void
  */
 function action_converser_dist() {
 	$update_session = false;
-	if (_request('arg') and spip_connect()) {
+	if (_request('arg') && spip_connect()) {
 		$securiser_action = charger_fonction('securiser_action', 'inc');
 		$securiser_action();
 		$update_session = true;
 	}
 
 	$lang = action_converser_changer_langue($update_session);
-	$redirect = rawurldecode(_request('redirect'));
+	$redirect = _request('redirect');
 
 	if (!$redirect) {
 		$redirect = param('spip.routes.back_office');
 	}
 	$redirect = parametre_url($redirect, 'lang', $lang, '&');
-	redirige_par_entete($redirect, true);
+	redirige_action($redirect);
 }
 
 /**
@@ -82,7 +78,6 @@
  *
  * @param string $lang
  * @param bool $ecrire
- * @return void
  */
 function action_converser_post($lang, $ecrire = false) {
 	if ($lang) {
diff -Nru spip-4.4.23+dfsg/ecrire/action/cookie.php spip-4.4.28+dfsg/ecrire/action/cookie.php
--- spip-4.4.23+dfsg/ecrire/action/cookie.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/cookie.php	2026-10-07 13:48:22.000000000 +0000
@@ -13,10 +13,7 @@
 
 /**
  * Gestion de l'action cookie
- *
- * @package SPIP\Core\Inscription
  */
-
 if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
@@ -31,13 +28,12 @@
  * @global bool ignore_auth_http
  * @param string|null $set_cookie_admin
  * @param string|null $change_session
- * @return void
  */
 function action_cookie_dist($set_cookie_admin = null, $change_session = null) {
 	$redirect_echec = $redirect = null;
 	$test_echec_cookie = null;
 	$url = '';
-	if (is_null($set_cookie_admin)) {
+	if ($set_cookie_admin === null) {
 		$set_cookie_admin = _request('cookie_admin');
 		$change_session = _request('change_session');
 		$test_echec_cookie = _request('test_echec_cookie');
@@ -52,7 +48,6 @@
 		}
 	}
 
-
 	// rejoue le cookie pour renouveler spip_session
 	if ($change_session == 'oui') {
 		$session = charger_fonction('session', 'inc');
@@ -63,15 +58,15 @@
 	}
 
 	// tentative de connexion en auth_http
-	if (_request('essai_auth_http') and !$GLOBALS['ignore_auth_http']) {
+	if (_request('essai_auth_http') && !$GLOBALS['ignore_auth_http']) {
 		include_spip('inc/auth');
 		if (
 			@$_SERVER['PHP_AUTH_USER']
-			and @$_SERVER['PHP_AUTH_PW']
-			and $auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])
+			&& @$_SERVER['PHP_AUTH_PW']
+			&& ($auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
 		) {
 			auth_loger($auteur);
-			redirige_par_entete(parametre_url($redirect, 't', time(), '&'));
+			redirige_action(parametre_url($redirect, 't', time(), '&'));
 		} else {
 			ask_php_auth(
 				_T('info_connexion_refusee'),
@@ -110,7 +105,7 @@
 				}
 			} // Ajout de cookie d'admin
 			else {
-				if ($set_cookie_admin and _DUREE_COOKIE_ADMIN) {
+				if ($set_cookie_admin && _DUREE_COOKIE_ADMIN) {
 					spip_setcookie('spip_admin', $set_cookie_admin, [
 						'expires' => time() + max(_DUREE_COOKIE_ADMIN, 2 * _RENOUVELLE_ALEA),
 						'httponly' => true,
@@ -122,6 +117,6 @@
 
 	// Redirection finale
 	if ($redirect) {
-		redirige_par_entete($redirect, true);
+		redirige_action($redirect, true);
 	}
 }
diff -Nru spip-4.4.23+dfsg/ecrire/action/debloquer_edition.php spip-4.4.28+dfsg/ecrire/action/debloquer_edition.php
--- spip-4.4.23+dfsg/ecrire/action/debloquer_edition.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/debloquer_edition.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
 page('', ['titre' => _T('info_acces_interdit')]);
@@ -126,11 +123,11 @@
 			'article',
 			$id_article,
 			[
-			'data' => $set,
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
-			'invalideur' => $invalideur,
-			'indexation' => $indexation,
-			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
+				'data' => $set,
+				'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
+				'invalideur' => $invalideur,
+				'indexation' => $indexation,
+				'date_modif' => 'date_modif', // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
 			],
 			$c
 		)
@@ -174,7 +171,6 @@
  * @param array|null $set
  * @return int
  *     Identifiant du nouvel article
- *
  */
 function article_inserer($id_rubrique, $set = null) {
 
@@ -199,10 +195,8 @@
 	// ou a defaut celle de la rubrique
 	// Sinon c'est la langue de la rubrique qui est choisie + heritee
 	if (
-		!empty($GLOBALS['meta']['multi_objets']) and in_array(
-			'spip_articles',
-			explode(',', $GLOBALS['meta']['multi_objets'])
-		)
+		!empty($GLOBALS['meta']['multi_objets'])
+		&& in_array('spip_articles', explode(',', $GLOBALS['meta']['multi_objets']))
 	) {
 		lang_select($GLOBALS['visiteur_session']['lang'] ?? '');
 		if (
@@ -227,7 +221,7 @@
 		'statut' => 'prepa',
 		'date' => date('Y-m-d H:i:s'),
 		'lang' => $lang,
-		'langue_choisie' => $choisie
+		'langue_choisie' => $choisie,
 	];
 
 	if ($set) {
@@ -241,7 +235,7 @@
 			'args' => [
 				'table' => 'spip_articles',
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -249,7 +243,7 @@
 
 	// controler si le serveur n'a pas renvoye une erreur
 	if ($id_article > 0) {
-		$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
+		$id_auteur = ((_request('id_auteur') === null && isset($GLOBALS['visiteur_session']['id_auteur'])) ?
 			$GLOBALS['visiteur_session']['id_auteur']
 			: _request('id_auteur'));
 		if ($id_auteur) {
@@ -263,9 +257,9 @@
 		[
 			'args' => [
 				'table' => 'spip_articles',
-				'id_objet' => $id_article
+				'id_objet' => $id_article,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -294,7 +288,6 @@
 	return $id_article;
 }
 
-
 /**
  * Modification des statuts d'un article
  *
@@ -333,10 +326,10 @@
 	$s = $c['statut'] ?? $statut;
 
 	// cf autorisations dans inc/instituer_article
-	if ($s != $statut or ($d and $d != $date)) {
+	if ($s != $statut || $d && $d != $date) {
 		if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
 			$statut = $champs['statut'] = $s;
-		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
+		} elseif (autoriser('modifier', 'article', $id_article) && $s != 'publie') {
 			$statut = $champs['statut'] = $s;
 		} else {
 			spip_log("editer_article $id_article refus " . join(' ', $c));
@@ -347,10 +340,9 @@
 		// ou si l'article est deja date dans le futur
 		// En cas de proposition d'un article (mais pas depublication), idem
 		if (
-			$champs['statut'] == 'publie'
-			or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
+			$champs['statut'] == 'publie' || $champs['statut'] == 'prop' && ($d || !in_array($statut_ancien, ['publie', 'prop']))
 		) {
-			if ($d or strtotime($d = $date) > time()) {
+			if ($d || strtotime($d = $date) > time()) {
 				$champs['date'] = $date = $d;
 			} else {
 				$champs['date'] = $date = date('Y-m-d H:i:s');
@@ -362,9 +354,9 @@
 	// de la rubrique actuelle
 	if (
 		isset($c['id_parent'])
-		and $id_parent = $c['id_parent']
-		and $id_parent != $id_rubrique
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
+		&& ($id_parent = $c['id_parent'])
+		&& $id_parent != $id_rubrique
+		&& sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent))
 	) {
 		$champs['id_rubrique'] = $id_parent;
 
@@ -373,7 +365,7 @@
 		// repasser l'article en statut 'propose'.
 		if (
 			$statut == 'publie'
-			and !autoriser('publierdans', 'rubrique', $id_parent)
+			&& !autoriser('publierdans', 'rubrique', $id_parent)
 		) {
 			$champs['statut'] = 'prop';
 		}
@@ -394,7 +386,7 @@
 				'date_ancienne' => $date_ancienne,
 				'id_parent_ancien' => $id_rubrique,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -412,7 +404,7 @@
 	if ($date) {
 		$t = strtotime($date);
 		$p = @$GLOBALS['meta']['date_prochain_postdate'];
-		if ($t > time() and (!$p or ($t < $p))) {
+		if ($t > time() && (!$p || $t < $p)) {
 			ecrire_meta('date_prochain_postdate', $t);
 		}
 	}
@@ -432,7 +424,7 @@
 				'date_ancienne' => $date_ancienne,
 				'id_parent_ancien' => $id_rubrique,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -526,15 +518,13 @@
 
 	if ($cond) {
 		include_spip('inc/rubriques');
-		$postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
+		$postdate = ($GLOBALS['meta']['post_dates'] == 'non' && isset($champs['date']) && strtotime($champs['date']) < time()) ? $champs['date'] : false;
 		calculer_rubriques_if($id_rubrique, $champs, ['statut_ancien' => $statut], $postdate);
 	}
 }
 
 /**
  * Réunit les textes decoupés parce que trop longs
- *
- * @return void
  */
 function trop_longs_articles() {
 	if (is_array($plus = _request('texte_plus'))) {
diff -Nru spip-4.4.23+dfsg/ecrire/action/editer_auteur.php spip-4.4.28+dfsg/ecrire/action/editer_auteur.php
--- spip-4.4.23+dfsg/ecrire/action/editer_auteur.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/editer_auteur.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,22 +1,19 @@
 page('', ['titre' => _T('info_acces_interdit')]);
@@ -51,7 +48,6 @@
 		}
 	}
 
-
 	// si id_auteur n'est pas un nombre, c'est une creation
 	if (!$id_auteur = intval($arg)) {
 		if (($id_auteur = auteur_inserer()) > 0) {
@@ -119,7 +115,7 @@
 			'args' => [
 				'table' => 'spip_auteurs',
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 	$id_auteur = sql_insertq('spip_auteurs', $champs);
@@ -128,9 +124,9 @@
 		[
 			'args' => [
 				'table' => 'spip_auteurs',
-				'id_objet' => $id_auteur
+				'id_objet' => $id_auteur,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -157,7 +153,6 @@
 	return $id_auteur;
 }
 
-
 /**
  * Modifier un auteur
  *
@@ -195,21 +190,21 @@
 			'auteur',
 			$id_auteur,
 			[
-			'data' => $set,
-			'nonvide' => ['nom' => _T('ecrire:item_nouvel_auteur')]
+				'data' => $set,
+				'nonvide' => ['nom' => _T('ecrire:item_nouvel_auteur')],
 			],
 			$c
 		)
 	) {
 		return $err;
 	}
-	$session = $c;
+	$changed_session = $c;
 
 	$err = '';
 	if (!$force_update) {
 		// Modification de statut, changement de rubrique ?
 		$c = collecter_requests(
-		// include list
+			// include list
 			[
 				'statut',
 				'new_login',
@@ -218,33 +213,51 @@
 				'pass',
 				'webmestre',
 				'restreintes',
-				'id_parent'
+				'id_parent',
 			],
 			// exclude list
 			[],
 			// donnees eventuellement fournies
 			$set
 		);
-		if (isset($c['new_login']) and !isset($c['login'])) {
+		if (isset($c['new_login']) && !isset($c['login'])) {
 			$c['login'] = $c['new_login'];
 		}
-		if (isset($c['new_pass']) and !isset($c['pass'])) {
+		if (isset($c['new_pass']) && !isset($c['pass'])) {
 			$c['pass'] = $c['new_pass'];
 		}
 		$err = auteur_instituer($id_auteur, $c);
-		$session = array_merge($session, $c);
+		$changed_session = array_merge($changed_session, $c);
 	}
 
 	// .. mettre a jour les sessions de cet auteur
-	include_spip('inc/session');
-	$session['id_auteur'] = $id_auteur;
-	unset($session['new_login']);
-	unset($session['new_pass']);
-	actualiser_sessions($session);
-
+	$session = auteur_recharger_variables_sessions($id_auteur, array_keys($changed_session));
+	if ($session) {
+		include_spip('inc/session');
+		actualiser_sessions($session);
+	}
 	return $err;
 }
 
+function auteur_recharger_variables_sessions(int $id_auteur, array $champs): ?array {
+	// on relit en base pour prendre en compte ce qui a été vraiment modifié ou pas selon les autorisations
+	$auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur = ' . intval($id_auteur));
+	if ($auteur) {
+		$session = ['id_auteur' => $id_auteur];
+		foreach ($champs as $champ) {
+			if (isset($auteur[$champ])) {
+				$session[$champ] = $auteur[$champ];
+			}
+		}
+		if (in_array('restreintes', $champs) || in_array('restreint', $champs)) {
+			include_spip('inc/autoriser');
+			$session['restreint'] = liste_rubriques_auteur($id_auteur, true);
+		}
+		return $session;
+	}
+	return null;
+}
+
 /**
  * Associer un auteur à des objets listés
  *
@@ -312,7 +325,6 @@
 	return objet_qualifier_liens(['auteur' => $id_auteur], $objets, $qualif);
 }
 
-
 /**
  * Modifier le statut d'un auteur, ou son login/pass
  *
@@ -362,7 +374,7 @@
 
 	// Restreindre avant de declarer l'auteur
 	// (section critique sur les droits)
-	if (isset($c['id_parent']) and $c['id_parent']) {
+	if (isset($c['id_parent']) && $c['id_parent']) {
 		if (is_array($c['restreintes'])) {
 			$c['restreintes'][] = $c['id_parent'];
 		} else {
@@ -372,13 +384,13 @@
 
 	if (
 		isset($c['webmestre'])
-		and ($force_webmestre or autoriser('modifier', 'auteur', $id_auteur, null, ['webmestre' => '?']))
+		&& ($force_webmestre || autoriser('modifier', 'auteur', $id_auteur, null, ['webmestre' => '?']))
 	) {
 		$champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non';
 	}
 
 	// si statut change et n'est pas 0minirezo, on force webmestre a non
-	if (isset($c['statut']) and $c['statut'] !== '0minirezo') {
+	if (isset($c['statut']) && $c['statut'] !== '0minirezo') {
 		$champs['webmestre'] = $c['webmestre'] = 'non';
 	}
 
@@ -395,13 +407,14 @@
 				'action' => 'instituer',
 				'statut_ancien' => $statut_ancien,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
 	if (
-		isset($c['restreintes']) and is_array($c['restreintes'])
-		and autoriser('modifier', 'auteur', $id_auteur, null, ['restreint' => $c['restreintes']])
+		isset($c['restreintes'])
+		&& is_array($c['restreintes'])
+		&& autoriser('modifier', 'auteur', $id_auteur, null, ['restreintes' => $c['restreintes']])
 	) {
 		$rubriques = array_map('intval', $c['restreintes']);
 		$rubriques = array_unique($rubriques);
@@ -413,15 +426,15 @@
 	$flag_ecrire_acces = false;
 	// commencer par traiter les cas particuliers des logins et pass
 	// avant les autres ecritures en base
-	if (isset($champs['login']) or isset($champs['pass'])) {
+	if (isset($champs['login']) || isset($champs['pass'])) {
 		$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
 		include_spip('inc/auth');
-		if (isset($champs['login']) and strlen($champs['login'])) {
+		if (isset($champs['login']) && strlen($champs['login'])) {
 			if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) {
 				$erreurs[] = 'ecrire:impossible_modifier_login_auteur';
 			}
 		}
-		if (isset($champs['pass']) and strlen($champs['pass'])) {
+		if (isset($champs['pass']) && strlen($champs['pass'])) {
 			$champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
 			if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) {
 				$erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
@@ -439,8 +452,7 @@
 
 	// .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
 	if (
-		$flag_ecrire_acces
-		or isset($champs['statut'])
+		$flag_ecrire_acces || isset($champs['statut'])
 	) {
 		include_spip('inc/acces');
 		ecrire_acces();
@@ -463,7 +475,7 @@
 				'action' => 'instituer',
 				'statut_ancien' => $statut_ancien,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
diff -Nru spip-4.4.23+dfsg/ecrire/action/editer_liens.php spip-4.4.28+dfsg/ecrire/action/editer_liens.php
--- spip-4.4.23+dfsg/ecrire/action/editer_liens.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/editer_liens.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,13 +1,13 @@
  false])
-		and !preg_match(',[^\w],', $primary)
-		and !preg_match(',[^\w],', $l)
+		($primary = id_table_objet($objet))
+		&& $trouver_table($l = $table_sql . '_liens', '', true, ['log_missing' => false])
+		&& !preg_match(',[^\w],', $primary)
+		&& !preg_match(',[^\w],', $l)
 	) {
 		return [$primary, $l];
 	}
@@ -96,7 +92,6 @@
 	return $modifs; // pas d'erreur
 }
 
-
 /**
  * Dissocier un (ou des) objet(s)  des objets listés
  *
@@ -130,7 +125,6 @@
 	return objet_traiter_liaisons('lien_delete', $objets_source, $objets_lies, $cond);
 }
 
-
 /**
  * Qualifier le lien entre un (ou des) objet(s) et des objets listés
  *
@@ -155,7 +149,6 @@
 	return objet_traiter_liaisons('lien_set', $objets_source, $objets_lies, $qualif);
 }
 
-
 /**
  * Trouver les liens entre objets
  *
@@ -190,7 +183,6 @@
 	return objet_traiter_liaisons('lien_find', $objets_source, $objets_lies, $cond);
 }
 
-
 /**
  * Nettoyer les liens morts vers des objets qui n'existent plus
  *
@@ -215,7 +207,6 @@
 	return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies);
 }
 
-
 /**
  * Dupliquer tous les liens entrant ou sortants d'un objet
  * vers un autre (meme type d'objet, mais id different)
@@ -237,8 +228,8 @@
 	$n = 0;
 	foreach ($tables as $table_sql => $infos) {
 		if (
-			(is_null($types) or in_array($infos['type'], $types))
-			and (is_null($exclure_types) or !in_array($infos['type'], $exclure_types))
+			($types === null || in_array($infos['type'], $types))
+			&& ($exclure_types === null || !in_array($infos['type'], $exclure_types))
 		) {
 			if (objet_associable($infos['type'])) {
 				$liens = (($infos['type'] == $objet) ?
@@ -249,8 +240,8 @@
 					$n++;
 					if ($infos['type'] == $objet) {
 						if (
-							(is_null($types) or in_array($lien['objet'], $types))
-							and (is_null($exclure_types) or !in_array($lien['objet'], $exclure_types))
+							($types === null || in_array($lien['objet'], $types))
+							&& ($exclure_types === null || !in_array($lien['objet'], $exclure_types))
 						) {
 							objet_associer([$objet => $id_cible], [$lien['objet'] => $lien[$lien['objet']]], $lien);
 						}
@@ -270,7 +261,6 @@
  * ne pas les appeler directement
  */
 
-
 /**
  * Fonction générique qui
  * applique une operation de liaison entre un ou des objets et des objets listés
@@ -335,10 +325,9 @@
 		}
 	}
 
-	return ($echec ? false : $modifs); // pas d'erreur
+	return $echec ? false : $modifs; // pas d'erreur
 }
 
-
 /**
  * Sous fonction insertion
  * qui traite les liens pour un objet source dont la clé primaire
@@ -366,9 +355,7 @@
 function lien_insert($objet_source, $primary, $table_lien, $id, $objets, $qualif) {
 	$ins = 0;
 	$echec = null;
-	if (is_null($qualif)) {
-		$qualif = [];
-	}
+	$qualif ??= [];
 
 	foreach ($objets as $objet => $id_objets) {
 		if (!is_array($id_objets)) {
@@ -385,20 +372,19 @@
 			$insertions = [
 				'id_objet' => $id_objet,
 				'objet' => $objet,
-				$primary => $id
+				$primary => $id,
 			];
 			// rôle en plus s'il est défini
 			if ($role) {
 				$insertions += [
-					$colonne_role => $role
+					$colonne_role => $role,
 				];
 			}
 
 			if (lien_triables($table_lien)) {
 				if (isset($qualif['rang_lien'])) {
 					$rang = $qualif['rang_lien'];
-				}
-				else {
+				} else {
 					$where = lien_where($primary, $id, $objet, $id_objet);
 					// si il y a deja un lien pour ce couple (avec un autre role?) on reprend le meme rang si non nul
 					if (!$rang = intval(sql_getfetsel('rang_lien', $table_lien, $where))) {
@@ -429,7 +415,7 @@
 				'pre_edition_lien',
 				[
 					'args' => $args,
-					'data' => $insertions
+					'data' => $insertions,
 				]
 			);
 			$args['id_objet'] = $insertions['id_objet'];
@@ -437,10 +423,10 @@
 			$where = lien_where($primary, $id, $objet, $id_objet, $cond);
 
 			if (
-				($id_objet = intval($insertions['id_objet']) or in_array($objet, ['site', 'rubrique']))
-				and !sql_getfetsel($primary, $table_lien, $where)
+				(($id_objet = intval($insertions['id_objet'])) || in_array($objet, ['site', 'rubrique']))
+				&& !sql_getfetsel($primary, $table_lien, $where)
 			) {
-				if (lien_triables($table_lien) and isset($insertions['rang_lien']) and intval($insertions['rang_lien'])) {
+				if (lien_triables($table_lien) && isset($insertions['rang_lien']) && intval($insertions['rang_lien'])) {
 					$where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
 					$where_meme_lien = implode(' AND ', $where_meme_lien);
 					// on decale les liens de rang_lien>=la valeur inseree pour faire la place
@@ -459,7 +445,7 @@
 						'post_edition_lien',
 						[
 							'args' => $args,
-							'data' => $insertions
+							'data' => $insertions,
 						]
 					);
 				} else {
@@ -470,14 +456,13 @@
 	}
 	// si on a fait des insertions, on reordonne les liens concernes
 	// pas la peine si $qualif['rang_lien'] etait fournie, on va passer dans lien_set a suivre et donc finir le recomptage
-	if ($ins > 0 and empty($qualif['rang_lien'])) {
+	if ($ins > 0 && empty($qualif['rang_lien'])) {
 		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
 	}
 
-	return ($echec ? false : $ins);
+	return $echec ? false : $ins;
 }
 
-
 /**
  * Reordonner les liens sur lesquels on est intervenus
  * @param string $objet_source
@@ -506,7 +491,7 @@
 				$liens = sql_allfetsel("$primary, id_objet, objet, rang_lien", $table_lien, $where, '', 'rang_lien');
 
 				$rangs = array_column($liens, 'rang_lien');
-				if (count($rangs) and (max($rangs) > 0 or min($rangs) < 0)) {
+				if (count($rangs) && (max($rangs) > 0 || min($rangs) < 0)) {
 					$rang = 1;
 					foreach ($liens as $lien) {
 						if (empty($deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']])) {
@@ -530,11 +515,9 @@
 	}
 }
 
-
 /**
  * Une table de lien est-elle triable ?
  * elle doit disposer d'un champ rang_lien pour cela
- * @param $table_lien
  * @return mixed
  */
 function lien_triables($table_lien) {
@@ -542,17 +525,15 @@
 	if (!isset($triables[$table_lien])) {
 		$trouver_table = charger_fonction('trouver_table', 'base');
 		$desc = $trouver_table($table_lien);
-		if ($desc and isset($desc['field']['rang_lien'])) {
+		if ($desc && isset($desc['field']['rang_lien'])) {
 			$triables[$table_lien] = true;
-		}
-		else {
+		} else {
 			$triables[$table_lien] = false;
 		}
 	}
 	return $triables[$table_lien];
 }
 
-
 /**
  * Fabriquer la condition where en tenant compte des jokers *
  *
@@ -566,15 +547,15 @@
  */
 function lien_where($primary, $id_source, $objet, $id_objet, $cond = []) {
 	if (
-		(!is_array($id_source) and !strlen($id_source))
-		or !strlen($objet)
-		or (!is_array($id_objet) and !strlen($id_objet))
+		!is_array($id_source) && !strlen($id_source)
+		|| !strlen($objet)
+		|| !is_array($id_objet) && !strlen($id_objet)
 	) {
 		return ['0=1'];
 	} // securite
 
 	$not = '';
-	if (is_array($id_source) and reset($id_source) == 'NOT') {
+	if (is_array($id_source) && reset($id_source) == 'NOT') {
 		$not = array_shift($id_source);
 		$id_source = reset($id_source);
 	}
@@ -592,7 +573,7 @@
 	} // idiot mais quand meme
 
 	$not = '';
-	if (is_array($id_objet) and reset($id_objet) == 'NOT') {
+	if (is_array($id_objet) && reset($id_objet) == 'NOT') {
 		$not = array_shift($id_objet);
 		$id_objet = reset($id_objet);
 	}
@@ -665,13 +646,11 @@
 	$retires = [];
 	$dels = 0;
 	$echec = false;
-	if (is_null($cond)) {
-		$cond = [];
-	}
+	$cond ??= [];
 
 	foreach ($objets as $objet => $id_objets) {
 		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
-		if (!is_array($id_objets) or reset($id_objets) == 'NOT') {
+		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
 			$id_objets = [$id_objets];
 		}
 		foreach ($id_objets as $id_objet) {
@@ -704,7 +683,7 @@
 					'pre_edition_lien',
 					[
 						'args' => $args,
-						'data' => $l
+						'data' => $l,
 					]
 				);
 				$args['id_objet'] = $id_o = $l['id_objet'];
@@ -724,14 +703,14 @@
 						'lien' => [$l['objet'] => $id_o],
 						'type' => $l['objet'],
 						'role' => ($colonne_role ? $l[$colonne_role] : ''),
-						'id' => $id_o
+						'id' => $id_o,
 					];
 					// Envoyer aux plugins
 					pipeline(
 						'post_edition_lien',
 						[
 							'args' => $args,
-							'data' => $l
+							'data' => $l,
 						]
 					);
 				}
@@ -747,10 +726,9 @@
 
 	pipeline('trig_supprimer_objets_lies', $retires);
 
-	return ($echec ? false : $dels);
+	return $echec ? false : $dels;
 }
 
-
 /**
  * Sous fonction optimisation
  * qui nettoie les liens morts (vers un objet inexistant)
@@ -775,7 +753,7 @@
 	$dels = 0;
 	foreach ($objets as $objet => $id_objets) {
 		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
-		if (!is_array($id_objets) or reset($id_objets) == 'NOT') {
+		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
 			$id_objets = [$id_objets];
 		}
 		foreach ($id_objets as $id_objet) {
@@ -834,10 +812,9 @@
 		}
 	}
 
-	return ($echec ? false : $dels);
+	return $echec ? false : $dels;
 }
 
-
 /**
  * Sous fonction qualification
  * qui traite les liens pour un objet source dont la clé primaire
@@ -886,7 +863,7 @@
 			roles_trouver_dans_qualif($objet_source, $objet, $qualif);
 
 		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
-		if (!is_array($id_objets) or reset($id_objets) == 'NOT') {
+		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
 			$id_objets = [$id_objets];
 		}
 		foreach ($id_objets as $id_objet) {
@@ -911,7 +888,7 @@
 			);
 			$args['id_objet'] = $id_objet;
 
-			if (lien_triables($table_lien) and isset($qualif['rang_lien'])) {
+			if (lien_triables($table_lien) && isset($qualif['rang_lien'])) {
 				if (intval($qualif['rang_lien'])) {
 					// on decale les liens de rang_lien>=la valeur inseree pour faire la place
 					// sauf sur le meme lien avec un role eventuellement different
@@ -939,7 +916,7 @@
 					'post_edition_lien',
 					[
 						'args' => $args,
-						'data' => $qualif
+						'data' => $qualif,
 					]
 				);
 				$ok++;
@@ -951,7 +928,7 @@
 		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
 	}
 
-	return ($echec ? false : $ok);
+	return $echec ? false : $ok;
 }
 
 /**
diff -Nru spip-4.4.23+dfsg/ecrire/action/editer_logo.php spip-4.4.28+dfsg/ecrire/action/editer_logo.php
--- spip-4.4.23+dfsg/ecrire/action/editer_logo.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/editer_logo.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,25 +1,21 @@
  $objet]);
 
-
 	$trouver_table = charger_fonction('trouver_table', 'base');
 	$chercher_logo = charger_fonction('chercher_logo', 'inc');
 	include_spip('inc/chercher_logo');
@@ -216,12 +209,12 @@
 			$logo = explode('.', $logo);
 			if (
 				is_numeric($logo[0])
-				and ($id_objet = intval($logo[0]) or in_array($objet, ['site', 'rubrique']))
+				&& (($id_objet = intval($logo[0])) || in_array($objet, ['site', 'rubrique']))
 			) {
 				if (!isset($deja[$id_objet])) {
 					$logo = $chercher_logo($id_objet, $_id_objet, $mode);
 					// if no logo in base
-					if (!$logo or (is_countable($logo) ? count($logo) : 0) < 6) {
+					if (!$logo || (is_countable($logo) ? count($logo) : 0) < 6) {
 						foreach ($formats_logos as $format) {
 							if (@file_exists($d = ($dir . ($nom = $nom_base . intval($id_objet) . '.' . $format)))) {
 								if (isset($desc['field']['date_modif'])) {
@@ -247,7 +240,7 @@
 			}
 			// 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 and file_exists($file)) {
+			if ($dir !== $dir_logos && file_exists($file)) {
 				@rename($file, $dir_logos_erreurs . basename($file));
 			}
 
@@ -256,7 +249,7 @@
 				spip_log("logo_migrer_en_base $objet $mode : " . $count . ' logos restant', 'maj' . _LOG_INFO_IMPORTANTE);
 			}
 
-			if ($time_limit and time() > $time_limit) {
+			if ($time_limit && time() > $time_limit) {
 				effacer_meta('drapeau_edition');
 				return;
 			}
diff -Nru spip-4.4.23+dfsg/ecrire/action/editer_objet.php spip-4.4.28+dfsg/ecrire/action/editer_objet.php
--- spip-4.4.23+dfsg/ecrire/action/editer_objet.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/editer_objet.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,22 +1,19 @@
 page('', ['titre' => _T('info_acces_interdit')]);
 		die();
@@ -107,8 +104,7 @@
 		$objet = $t;
 	}
 	if (
-		include_spip('action/editer_' . $objet)
-		and function_exists($modifier = $objet . '_modifier')
+		include_spip('action/editer_' . $objet) && function_exists($modifier = $objet . '_modifier')
 	) {
 		return $modifier($id, $set);
 	}
@@ -116,7 +112,7 @@
 	$table_sql = table_objet_sql($objet);
 	$trouver_table = charger_fonction('trouver_table', 'base');
 	$desc = $trouver_table($table_sql);
-	if (!$desc or !isset($desc['field'])) {
+	if (!$desc || !isset($desc['field'])) {
 		spip_log("Objet $objet inconnu dans objet_modifier", 'editer' . _LOG_ERREUR);
 
 		return _L("Erreur objet $objet inconnu");
@@ -124,7 +120,7 @@
 	include_spip('inc/modifier');
 
 	$champ_date = '';
-	if (isset($desc['date']) and $desc['date']) {
+	if (isset($desc['date']) && $desc['date']) {
 		$champ_date = $desc['date'];
 	} elseif (isset($desc['field']['date'])) {
 		$champ_date = 'date';
@@ -161,12 +157,12 @@
 			$objet,
 			$id,
 			[
-			'data' => $set,
-			'nonvide' => '',
-			'invalideur' => $invalideur,
-			'indexation' => $indexation,
-			// champ a mettre a date('Y-m-d H:i:s') s'il y a modif
-			'date_modif' => (isset($desc['field']['date_modif']) ? 'date_modif' : '')
+				'data' => $set,
+				'nonvide' => '',
+				'invalideur' => $invalideur,
+				'indexation' => $indexation,
+				// champ a mettre a date('Y-m-d H:i:s') s'il y a modif
+				'date_modif' => (isset($desc['field']['date_modif']) ? 'date_modif' : ''),
 			],
 			$c
 		)
@@ -218,7 +214,7 @@
 	}
 	if (
 		include_spip('action/editer_' . $objet)
-		and function_exists($inserer = $objet . '_inserer')
+		&& function_exists($inserer = $objet . '_inserer')
 	) {
 		return $inserer($id_parent, $set);
 	}
@@ -226,7 +222,7 @@
 	$table_sql = table_objet_sql($objet);
 	$trouver_table = charger_fonction('trouver_table', 'base');
 	$desc = $trouver_table($table_sql);
-	if (!$desc or !isset($desc['field'])) {
+	if (!$desc || !isset($desc['field'])) {
 		return 0;
 	}
 
@@ -254,7 +250,7 @@
 	// ou a defaut celle de la rubrique
 	// Sinon c'est la langue de la rubrique qui est choisie + heritee
 	if (
-		isset($desc['field']['lang']) and !empty($GLOBALS['meta']['multi_objets']) and in_array(
+		isset($desc['field']['lang']) && !empty($GLOBALS['meta']['multi_objets']) && in_array(
 			$table_sql,
 			explode(',', $GLOBALS['meta']['multi_objets'])
 		)
@@ -271,7 +267,7 @@
 				$champs['langue_choisie'] = 'oui';
 			}
 		}
-	} elseif (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
+	} elseif (isset($desc['field']['lang']) && isset($desc['field']['langue_choisie'])) {
 		$champs['lang'] = ($lang_rub ?: $GLOBALS['meta']['langue_site']);
 		$champs['langue_choisie'] = 'non';
 	}
@@ -285,8 +281,7 @@
 		}
 	}
 
-
-	if ((isset($desc['date']) and $d = $desc['date']) or isset($desc['field'][$d = 'date'])) {
+	if (isset($desc['date']) && ($d = $desc['date']) || isset($desc['field'][$d = 'date'])) {
 		$champs[$d] = date('Y-m-d H:i:s');
 	}
 
@@ -302,7 +297,7 @@
 				'table' => $table_sql,
 				'id_parent' => $id_parent,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -315,10 +310,10 @@
 		// et si le form n'a pas poste un id_auteur (meme vide, ce qui sert a annuler cette auto association)
 		if (
 			$id > 0
-			and !isset($desc['field']['id_auteur'])
+			&& !isset($desc['field']['id_auteur'])
 		) {
-			$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
-				$GLOBALS['visiteur_session']['id_auteur']
+			$id_auteur = ((_request('id_auteur') === null && isset($GLOBALS['visiteur_session']['id_auteur']))
+				? $GLOBALS['visiteur_session']['id_auteur']
 				: _request('id_auteur'));
 			if ($id_auteur) {
 				include_spip('action/editer_auteur');
@@ -334,7 +329,7 @@
 					'id_parent' => $id_parent,
 					'id_objet' => $id,
 				],
-				'data' => $champs
+				'data' => $champs,
 			]
 		);
 	}
@@ -364,7 +359,6 @@
 	return $id;
 }
 
-
 /**
  * Modifie le statut et/ou la date d'un objet
  *
@@ -383,8 +377,7 @@
 		$objet = $t;
 	}
 	if (
-		include_spip('action/editer_' . $objet)
-		and function_exists($instituer = $objet . '_instituer')
+		include_spip('action/editer_' . $objet) && function_exists($instituer = $objet . '_instituer')
 	) {
 		return $instituer($id, $c, $calcul_rub);
 	}
@@ -393,7 +386,7 @@
 	$table_objet = table_objet($objet);
 	$trouver_table = charger_fonction('trouver_table', 'base');
 	$desc = $trouver_table($table_sql);
-	if (!$desc or !isset($desc['field'])) {
+	if (!$desc || !isset($desc['field'])) {
 		return _L("Impossible d'instituer $objet : non connu en base");
 	}
 
@@ -405,7 +398,7 @@
 	$sel[] = (isset($desc['field']['statut']) ? 'statut' : "'' as statut");
 
 	$champ_date = '';
-	if (isset($desc['date']) and $desc['date']) {
+	if (isset($desc['date']) && $desc['date']) {
 		$champ_date = $desc['date'];
 	} elseif (isset($desc['field']['date'])) {
 		$champ_date = 'date';
@@ -421,11 +414,11 @@
 	$date_ancienne = $date = $row['date'];
 	$champs = [];
 
-	$d = ($date and isset($c[$champ_date])) ? $c[$champ_date] : null;
-	$s = (isset($desc['field']['statut']) and isset($c['statut'])) ? $c['statut'] : $statut;
+	$d = ($date && isset($c[$champ_date])) ? $c[$champ_date] : null;
+	$s = (isset($desc['field']['statut']) && isset($c['statut'])) ? $c['statut'] : $statut;
 
 	// cf autorisations dans inc/instituer_objet
-	if ($s != $statut or ($d and $d != $date)) {
+	if ($s != $statut || $d && $d != $date) {
 		if (
 			$id_rubrique ?
 			autoriser('publierdans', 'rubrique', $id_rubrique)
@@ -434,7 +427,7 @@
 		) {
 			$statut = $champs['statut'] = $s;
 		} else {
-			if ($s != 'publie' and autoriser('modifier', $objet, $id)) {
+			if ($s != 'publie' && autoriser('modifier', $objet, $id)) {
 				$statut = $champs['statut'] = $s;
 			} else {
 				spip_log("editer_objet $objet #$id refus " . json_encode($c, JSON_THROW_ON_ERROR), 'editer' . _LOG_INFO_IMPORTANTE);
@@ -448,10 +441,10 @@
 		if ($champ_date) {
 			if (
 				$champs['statut'] == 'publie'
-				or ($champs['statut'] == 'prop' and !in_array($statut_ancien, ['publie', 'prop']))
-				or $d
+				|| $champs['statut'] == 'prop' && !in_array($statut_ancien, ['publie', 'prop'])
+				|| $d
 			) {
-				if ($d or strtotime($d = $date) > time()) {
+				if ($d || strtotime($d = $date) > time()) {
 					$champs[$champ_date] = $date = $d;
 				} else {
 					$champs[$champ_date] = $date = date('Y-m-d H:i:s');
@@ -463,11 +456,10 @@
 	// Verifier que la rubrique demandee existe et est differente
 	// de la rubrique actuelle
 	if (
-		$id_rubrique
-		and isset($c['id_parent'])
-		and $id_parent = $c['id_parent']
-		and $id_parent != $id_rubrique
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
+		$id_rubrique && isset($c['id_parent'])
+		&& ($id_parent = $c['id_parent'])
+		&& $id_parent != $id_rubrique
+		&& sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent))
 	) {
 		$champs['id_rubrique'] = $id_parent;
 
@@ -476,13 +468,12 @@
 		// repasser l'objet en statut 'propose'.
 		if (
 			$statut == 'publie'
-			and !autoriser('publierdans', 'rubrique', $id_rubrique)
+			&& !autoriser('publierdans', 'rubrique', $id_rubrique)
 		) {
 			$champs['statut'] = 'prop';
 		}
 	}
 
-
 	// Envoyer aux plugins
 	$champs = pipeline(
 		'pre_edition',
@@ -498,7 +489,7 @@
 				'date_ancienne' => $date_ancienne,
 				'id_parent_ancien' => $id_rubrique,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -537,7 +528,7 @@
 				'date_ancienne' => $date_ancienne,
 				'id_parent_ancien' => $id_rubrique,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -590,7 +581,6 @@
  * @param string $statut
  * @param array $champs
  * @param bool $cond
- * @return void
  */
 function objet_editer_heritage($objet, $id, $id_rubrique, $statut, $champs, $cond = true) {
 	$table_sql = table_objet_sql($objet);
@@ -607,7 +597,7 @@
 			$champs['id_secteur'] = $row_rub['id_secteur'];
 		}
 
-		if (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
+		if (isset($desc['field']['lang']) && isset($desc['field']['langue_choisie'])) {
 			if (
 				sql_fetsel(
 					'1',
@@ -628,7 +618,7 @@
 	// Changer le statut des rubriques concernees
 	if ($cond) {
 		include_spip('inc/rubriques');
-		//$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
+		// $postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
 		$postdate = false;
 		// On rajoute les infos de l'objet
 		$infos = [
@@ -640,7 +630,6 @@
 	}
 }
 
-
 /**
  * Lit un objet donné connu par son id ou par un identifiant textuel unique et renvoie tout ou partie de sa
  * description.
@@ -685,12 +674,12 @@
 	// Si l'objet n'a pas encore été stocké, il faut récupérer sa description complète.
 	if (
 		!isset($descriptions[$objet][$champ_id][$valeur_id])
-		or (isset($options['force']) and $options['force'])
+		|| isset($options['force']) && $options['force']
 	) {
 		// Il est possible pour un type d'objet de fournir une fonction de lecture de tous les champs d'un objet.
 		if (
 			include_spip('action/editer_' . $objet)
-			and function_exists($lire = "{$objet}_lire_champs")
+			&& function_exists($lire = "{$objet}_lire_champs")
 		) {
 			$valeurs = $lire($objet, $valeur_id, $champ_id);
 		} else {
@@ -699,7 +688,7 @@
 
 			// La condition est appliquée sur le champ désigné par l'utilisateur.
 			$where = [
-				$champ_id . '=' . sql_quote($valeur_id)
+				$champ_id . '=' . sql_quote($valeur_id),
 			];
 
 			// Acquisition de tous les champs de l'objet : si l'accès SQL retourne une erreur on renvoie un tableau vide.
@@ -712,7 +701,7 @@
 
 		$descriptions[$objet][$champ_id][$valeur_id] = $valeurs;
 
-		if ($champ_id !== $primary and isset($valeurs[$primary])) {
+		if ($champ_id !== $primary && isset($valeurs[$primary])) {
 			$descriptions[$objet][$primary][$valeurs[$primary]] = $valeurs;
 			$descriptions[$objet][$champ_id][$valeur_id] = &$descriptions[$objet][$primary][$valeurs[$primary]];
 		}
@@ -722,7 +711,7 @@
 
 	// On ne retourne maintenant que les champs demandés.
 	// - on détermine les informations à renvoyer.
-	if ($retour and !empty($options['champs'])) {
+	if ($retour && !empty($options['champs'])) {
 		$champs = $options['champs'];
 		// Extraction des seules informations demandées.
 		// -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau.
diff -Nru spip-4.4.23+dfsg/ecrire/action/editer_rubrique.php spip-4.4.28+dfsg/ecrire/action/editer_rubrique.php
--- spip-4.4.23+dfsg/ecrire/action/editer_rubrique.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/editer_rubrique.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,18 @@
 page('', ['titre' => _T('info_acces_interdit')]);
@@ -70,14 +67,12 @@
 			'&'
 		);
 
-		include_spip('inc/headers');
-		redirige_par_entete($redirect);
+		redirige_action($redirect);
 	}
 
 	return [$id_rubrique, $err];
 }
 
-
 /**
  * Insérer une rubrique en base
  *
@@ -92,7 +87,7 @@
 	$champs = [
 		'titre' => _T('item_nouvelle_rubrique'),
 		'id_parent' => intval($id_parent),
-		'statut' => 'prepa'
+		'statut' => 'prepa',
 	];
 
 	if ($set) {
@@ -106,7 +101,7 @@
 			'args' => [
 				'table' => 'spip_rubriques',
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 
@@ -116,9 +111,9 @@
 		[
 			'args' => [
 				'table' => 'spip_rubriques',
-				'id_objet' => $id_rubrique
+				'id_objet' => $id_rubrique,
 			],
-			'data' => $champs
+			'data' => $champs,
 		]
 	);
 	propager_les_secteurs();
@@ -180,8 +175,8 @@
 			'rubrique',
 			$id_rubrique,
 			[
-			'data' => $set,
-			'nonvide' => ['titre' => _T('titre_nouvelle_rubrique') . ' ' . _T('info_numero_abbreviation') . $id_rubrique]
+				'data' => $set,
+				'nonvide' => ['titre' => _T('titre_nouvelle_rubrique') . ' ' . _T('info_numero_abbreviation') . $id_rubrique],
 			],
 			$c
 		)
@@ -232,7 +227,7 @@
 		return true;
 	}
 
-	if (empty($c['confirme_deplace']) or $c['confirme_deplace'] != 'oui') {
+	if (empty($c['confirme_deplace']) || $c['confirme_deplace'] != 'oui') {
 		return false;
 	}
 
@@ -249,7 +244,6 @@
 	return true;
 }
 
-
 /**
  * Instituer une rubrique (changer son parent)
  *
@@ -275,17 +269,18 @@
 	if (null !== ($id_parent = $c['id_parent'])) {
 		$id_parent = intval($id_parent);
 		$filles = calcul_branche_in($id_rubrique);
-		if (strpos(",$id_parent,", (string) ",$filles,") !== false) {
+		if (str_contains(",$id_parent,", (string) ",$filles,")) {
 			spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
 		} else {
 			$s = sql_fetsel('id_parent, statut', 'spip_rubriques', "id_rubrique=$id_rubrique");
 			$old_parent = $s['id_parent'];
 
 			if (
-				!($id_parent != $old_parent
-				and autoriser('publierdans', 'rubrique', $id_parent)
-				and autoriser('creerrubriquedans', 'rubrique', $id_parent)
-				and autoriser('publierdans', 'rubrique', $old_parent)
+				!(
+					$id_parent != $old_parent
+					&& autoriser('publierdans', 'rubrique', $id_parent)
+					&& autoriser('creerrubriquedans', 'rubrique', $id_parent)
+					&& autoriser('publierdans', 'rubrique', $old_parent)
 				)
 			) {
 				if ($s['statut'] != 'prepa') {
@@ -295,7 +290,6 @@
 				$statut_ancien = $s['statut'];
 				sql_updateq('spip_rubriques', ['id_parent' => $id_parent], "id_rubrique=$id_rubrique");
 
-
 				propager_les_secteurs();
 
 				// Deplacement d'une rubrique publiee ==> chgt general de leur statut
diff -Nru spip-4.4.23+dfsg/ecrire/action/etre_webmestre.php spip-4.4.28+dfsg/ecrire/action/etre_webmestre.php
--- spip-4.4.23+dfsg/ecrire/action/etre_webmestre.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/etre_webmestre.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
  'oui'], true);
 	}
diff -Nru spip-4.4.23+dfsg/ecrire/action/forcer_job.php spip-4.4.28+dfsg/ecrire/action/forcer_job.php
--- spip-4.4.23+dfsg/ecrire/action/forcer_job.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/forcer_job.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,28 +1,23 @@
  $r, 'nom' => $nom, 'prefs' => $statut];
 	if (isset($options['login'])) {
 		$login = trim(corriger_caracteres($options['login']));
-		if ((strlen($login) >= _LOGIN_TROP_COURT) and (strlen($nom) <= 64)) {
+		if (strlen($login) >= _LOGIN_TROP_COURT && strlen($nom) <= 64) {
 			$res['login'] = $login;
 		}
 	}
-	if (!isset($res['login']) and ((strlen($nom) < _LOGIN_TROP_COURT) or (strlen($nom) > 64))) {
+	if (!isset($res['login']) && (strlen($nom) < _LOGIN_TROP_COURT || strlen($nom) > 64)) {
 		return 'ecrire:info_login_trop_court';
 	}
 
 	return $res;
 }
 
-
 /**
  * On enregistre le demandeur comme 'nouveau', en memorisant le statut final
  * provisoirement dans le champ prefs, afin de ne pas visualiser les inactifs
@@ -158,7 +149,7 @@
  * @return mixed|string
  */
 function inscription_nouveau($desc) {
-	if (!isset($desc['login']) or !strlen($desc['login'])) {
+	if (!isset($desc['login']) || !strlen($desc['login'])) {
 		$desc['login'] = test_login($desc['nom'], $desc['email']);
 	}
 
@@ -187,7 +178,6 @@
 	return $desc;
 }
 
-
 /**
  * Retourne un login valide à partir du nom et email donné
  *
@@ -216,7 +206,7 @@
 
 	$login = $login_base;
 
-	for ($i = 1;; $i++) {
+	for ($i = 1; ; $i++) {
 		if (!sql_countsel('spip_auteurs', "login='$login'")) {
 			return $login;
 		}
@@ -224,7 +214,6 @@
 	}
 }
 
-
 /**
  * Construction du mail envoyant les identifiants
  *
@@ -257,7 +246,7 @@
 	$contexte['url_reset'] = generer_url_public('spip_pass', 'p=' . $contexte['jeton'], false, false);
 
 	$modele_mail = 'modeles/mail_inscription';
-	if (isset($options['modele_mail']) and $options['modele_mail']) {
+	if (isset($options['modele_mail']) && $options['modele_mail']) {
 		$modele_mail = $options['modele_mail'];
 	}
 	$message = recuperer_fond($modele_mail, $contexte);
@@ -267,7 +256,6 @@
 	return ['', $message, $from, $head];
 }
 
-
 /**
  * Creer un mot de passe initial aleatoire
  *
@@ -300,9 +288,10 @@
 	include_spip('inc/autoriser');
 	if ($statut_tmp) {
 		return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
-	} elseif (
+	}
+	if (
 		autoriser('inscrireauteur', $statut_tmp = '1comite', $id)
-		or autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
+		|| autoriser('inscrireauteur', $statut_tmp = '6forum', $id)
 	) {
 		return $statut_tmp;
 	}
@@ -310,7 +299,6 @@
 	return '';
 }
 
-
 /**
  * Un nouvel inscrit prend son statut definitif a la 1ere connexion.
  * Le statut a ete memorise dans prefs (cf test_inscription_dist).
@@ -352,7 +340,6 @@
 	return $auteur;
 }
 
-
 /**
  * Attribuer un jeton temporaire pour un auteur en assurant l'unicite du jeton.
  *
@@ -360,7 +347,6 @@
  * et invalide donc le précédent
  *
  * @param int $id_auteur
- * @return string
  */
 function auteur_attribuer_jeton($id_auteur): string {
 	include_spip('base/abstract_sql');
@@ -385,9 +371,7 @@
  * Cette fonction peut être pratique si plusieurs notifications proches
  * dans la durée sont envoyées au même auteur.
  *
- * @param int $id_auteur
  * @param bool $autoInit Attribue un jeton à l’auteur s’il n’en a pas déjà.
- * @return string|null
  */
 function auteur_lire_jeton(int $id_auteur, bool $autoInit = false): ?string {
 	include_spip('base/abstract_sql');
diff -Nru spip-4.4.23+dfsg/ecrire/action/instituer_langue_objet.php spip-4.4.28+dfsg/ecrire/action/instituer_langue_objet.php
--- spip-4.4.23+dfsg/ecrire/action/instituer_langue_objet.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/instituer_langue_objet.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
  0
-		and $GLOBALS['meta']['multi_rubriques'] == 'oui'
-		and ($GLOBALS['meta']['multi_secteurs'] == 'non' or $id_parent == 0)
+		$changer_lang && $id_rubrique > 0
+		&& $GLOBALS['meta']['multi_rubriques'] == 'oui'
+		&& ($GLOBALS['meta']['multi_secteurs'] == 'non' || $id_parent == 0)
 	) {
 		if ($changer_lang != 'herit') {
 			sql_updateq(
 				'spip_rubriques',
-				['lang' => $changer_lang, 'langue_choisie' => 'oui'],
+				[
+					'lang' => $changer_lang,
+					'langue_choisie' => 'oui',
+				],
 				"id_rubrique=$id_rubrique"
 			);
 		} else {
@@ -50,7 +49,10 @@
 			}
 			sql_updateq(
 				'spip_rubriques',
-				['lang' => $langue_parent, 'langue_choisie' => 'non'],
+				[
+					'lang' => $langue_parent,
+					'langue_choisie' => 'non',
+				],
 				"id_rubrique=$id_rubrique"
 			);
 		}
diff -Nru spip-4.4.23+dfsg/ecrire/action/instituer_objet.php spip-4.4.28+dfsg/ecrire/action/instituer_objet.php
--- spip-4.4.23+dfsg/ecrire/action/instituer_objet.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/instituer_objet.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
  $GLOBALS['visiteur_session'] ?? [],
 	]);
-	include_spip('inc/headers');
-	redirige_par_entete($url);
+
+	redirige_action($url);
 }
 
 /**
@@ -127,7 +122,7 @@
  * @return string
  */
 function generer_jeton_logout($session, $alea = null) {
-	if (is_null($alea)) {
+	if ($alea === null) {
 		include_spip('inc/acces');
 		$alea = charger_aleas();
 	}
diff -Nru spip-4.4.23+dfsg/ecrire/action/menu_rubriques.php spip-4.4.28+dfsg/ecrire/action/menu_rubriques.php
--- spip-4.4.23+dfsg/ecrire/action/menu_rubriques.php	2026-09-02 11:56:18.000000000 +0000
+++ spip-4.4.28+dfsg/ecrire/action/menu_rubriques.php	2026-10-07 13:48:22.000000000 +0000
@@ -1,20 +1,17 @@
 '
 		. ''
@@ -139,7 +134,7 @@
  *
  * @return string
  *     Code HTML présentant la liste des rubriques
- **/
+ */
 function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal, $profondeur = 1) {
 	static $zmax = 6;
 	$profondeur_next = $profondeur + 1;
@@ -163,7 +158,6 @@
 		return "\n
  • $nav
  • "; } - $nb_col = 1; if ($nb_rub = count($arr_rub)) { $nb_col = min(10, max(1, ceil($nb_rub / 10))); @@ -185,7 +179,6 @@ return $ret; } - /** * Obtient la liste des rubriques enfants d'une rubrique, prise dans le cache * du navigateur de rubrique @@ -198,7 +191,7 @@ * Cache des rubriques * @return array * Liste des rubriques enfants de la rubrique (et leur titre) - **/ + */ function extraire_article($id_p, $t) { return array_key_exists($id_p, $t) ? $t[$id_p] : []; } @@ -213,7 +206,7 @@ * - stocké également dans la globale `db_art_cache` * * @return bool true. - **/ + */ function gen_liste_rubriques() { $cache = null; diff -Nru spip-4.4.23+dfsg/ecrire/action/purger.php spip-4.4.28+dfsg/ecrire/action/purger.php --- spip-4.4.23+dfsg/ecrire/action/purger.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/action/purger.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,19 +1,17 @@ true]); purger_repertoire(_DIR_AIDE); diff -Nru spip-4.4.23+dfsg/ecrire/action/purger_queue.php spip-4.4.28+dfsg/ecrire/action/purger_queue.php --- spip-4.4.23+dfsg/ecrire/action/purger_queue.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/action/purger_queue.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,27 +1,23 @@ ,racine})] * ``` - **/ + */ function action_redirect_dist() { $type = _request('type'); $id = intval(_request('id')); @@ -68,23 +65,23 @@ if ( $var_mode == 'preview' - and defined('_PREVIEW_TOKEN') - and _PREVIEW_TOKEN - and autoriser('previsualiser') + && defined('_PREVIEW_TOKEN') + && _PREVIEW_TOKEN + && autoriser('previsualiser') ) { include_spip('inc/securiser_action'); $token = calculer_token_previsu($url); - $url = parametre_url($url, 'var_previewtoken', $token); + $url = parametre_url($url, 'var_previewtoken', $token, '&'); } - if (_request('status') and _request('status') == '301') { + if (_request('status') && _request('status') == '301') { $status = '301'; } } else { $url = generer_url_public('404', '', true); } - redirige_par_entete(str_replace('&', '&', $url), '', $status); + redirige_action($url, $status); } /** @@ -110,11 +107,11 @@ $key = "url-$date-$type-$id"; // Obtenir l’url et si elle est publié du cache memoization - if (function_exists('cache_get') and $desc = cache_get($key)) { + if (function_exists('cache_get') && $desc = cache_get($key)) { [$url, $publie] = $desc; } // Si on ne l’a pas trouvé, ou si var mode, on calcule l’url et son état publie - if (empty($desc) or $var_mode) { + if (empty($desc) || $var_mode) { $publie = objet_test_si_publie($type, $id); $url = generer_objet_url_absolue($id, $type, '', '', true); if (function_exists('cache_set')) { @@ -125,9 +122,9 @@ // On valide l’url si elle est publiee ; sinon si preview on teste l’autorisation if ($publie) { return $url; - } elseif (defined('_VAR_PREVIEW') and _VAR_PREVIEW and autoriser('voir', $type, $id)) { + } + if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && autoriser('voir', $type, $id)) { return $url; } - return; } diff -Nru spip-4.4.23+dfsg/ecrire/action/referencer_traduction.php spip-4.4.28+dfsg/ecrire/action/referencer_traduction.php --- spip-4.4.23+dfsg/ecrire/action/referencer_traduction.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/action/referencer_traduction.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ !str_starts_with($k, '_'), ARRAY_FILTER_USE_KEY); + $vars = array_filter($vars, fn ($k) => !str_starts_with($k, '_'), ARRAY_FILTER_USE_KEY); $vars = json_encode($vars); include_spip('inc/session'); session_set('session_' . $cle_autosave, $vars); - #spip_log("autosave:$cle_autosave:$vars",'autosave' . _LOG_DEBUG); + # spip_log("autosave:$cle_autosave:$vars",'autosave' . _LOG_DEBUG); } } # TODO: mode lecture de session ; n'afficher que ce qu'il faut - #echo json_encode($GLOBALS['visiteur_session']); + # echo json_encode($GLOBALS['visiteur_session']); } diff -Nru spip-4.4.23+dfsg/ecrire/action/super_cron.php spip-4.4.28+dfsg/ecrire/action/super_cron.php --- spip-4.4.23+dfsg/ecrire/action/super_cron.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/action/super_cron.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $ids], [$objet_lie => $idl], [$qualif => $valeur_qualif ]); + objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], [$qualif => $valeur_qualif]); } else { [$objet_source, $ids, $objet_lie, $idl] = $args; objet_dissocier([$objet_source => $ids], [$objet_lie => $idl]); diff -Nru spip-4.4.23+dfsg/ecrire/action/supprimer_rubrique.php spip-4.4.28+dfsg/ecrire/action/supprimer_rubrique.php --- spip-4.4.23+dfsg/ecrire/action/supprimer_rubrique.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/action/supprimer_rubrique.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'], 'nom' => 'cn', 'email' => 'mail', - 'bio' => 'description' + 'bio' => 'description', ]; } @@ -61,7 +58,7 @@ $phpauth = false ) { - #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent")); + # spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent")); // Utilisateur connu ? // si http auth, inutile de reauthentifier: cela @@ -83,7 +80,7 @@ if ( $GLOBALS['meta']['ldap_statut_import'] - and $desc = auth_ldap_retrouver($dn, [], $serveur) + && ($desc = auth_ldap_retrouver($dn, [], $serveur)) ) { // rajouter le statut indique a l'install $desc['statut'] = $GLOBALS['meta']['ldap_statut_import']; @@ -129,12 +126,12 @@ $f = _DIR_CONNECT . $connexion['authentification']['ldap']; unset($GLOBALS['ldap_link']); if (is_readable($f)) { - include_once($f); - }; + include_once $f; + } if (isset($GLOBALS['ldap_link'])) { $connexion['ldap'] = [ 'link' => $GLOBALS['ldap_link'], - 'base' => $GLOBALS['ldap_base'] + 'base' => $GLOBALS['ldap_base'], ]; } else { spip_log("connection LDAP $serveur mal definie dans $f"); @@ -169,7 +166,7 @@ ) { // Securite anti-injection et contre un serveur LDAP laxiste $login_search = preg_replace('/[^-@._\s\d\w]/', '', $login); - if (!strlen($login_search) or ($checkpass and !strlen($pass))) { + if (!strlen($login_search) || $checkpass && !strlen($pass)) { return ''; } @@ -191,7 +188,7 @@ // Ne pas accepter les resultats si plus d'une entree // (on veut un attribut unique) - if (is_array($info) and $info['count'] == 1) { + if (is_array($info) && $info['count'] == 1) { $dn = $info[0]['dn']; if (!$checkpass) { return $dn; @@ -202,7 +199,7 @@ } } - if ($checkpass and !isset($dn)) { + if ($checkpass && !isset($dn)) { // Si echec, essayer de deviner le DN foreach ($logins as $att) { $dn = "$att=$login_search, $ldap_base"; @@ -245,7 +242,7 @@ // Recuperer les donnees du premier (unique?) compte de l'auteur $val = @ldap_get_entries($ldap_link, $result); - if (!is_array($val) or !is_array($val[0])) { + if (!is_array($val) || !is_array($val[0])) { return []; } $val = $val[0]; @@ -260,7 +257,6 @@ return $desc; } - /** * Retrouver le login de quelqu'un qui cherche à se loger * @@ -328,9 +324,6 @@ * compte générique defini dans config/ldap.php n'a généralement pas (et * ne devrait pas avoir) les droits suffisants pour faire la modification. * - * @param $login - * @param $new_pass - * @param $id_auteur * @param string $serveur * @return bool * Informe du succès ou de l'echec du changement du mot de passe @@ -342,7 +335,7 @@ $id_auteur, $serveur = '' ) { - if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { + if ($new_pass === null || auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { return false; } if (!$ldap = auth_ldap_connect($serveur)) { @@ -351,7 +344,7 @@ $link = $ldap['link']; include_spip('inc/session'); $dn = session_get('ldap_dn'); - if ('' == $dn) { + if ($dn == '') { return false; } if (!ldap_bind($link, $dn, session_get('ldap_password'))) { diff -Nru spip-4.4.23+dfsg/ecrire/auth/spip.php spip-4.4.28+dfsg/ecrire/auth/spip.php --- spip-4.4.23+dfsg/ecrire/auth/spip.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/auth/spip.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,19 +1,17 @@ restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) { spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE); if ($cles->save()) { $secret = $cles->getSecretAuth(); - } - else { + } else { spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); // et on echoue car on ne veut pas que la situation reste telle quelle raler_fichier($fichier_cles ?: _DIR_ETC . 'cles.php'); } - } - else { + } else { spip_log('Pas de cle secrete disponible (fichier ' . ($fichier_cles ?: 'config/cle.php') . ' absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR); sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur'])); } } - if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) { + if (!$secret || !Password::verifier($pass, $row['pass'], $secret)) { unset($row); - } - else { + } else { spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG); } break; @@ -142,7 +139,7 @@ // ET si c'est le login d'un auteur qui peut sauver la cle // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php) // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre - if (!$secret and $auteur_peut_sauver_cles) { + if (!$secret && $auteur_peut_sauver_cles) { if (auth_spip_initialiser_secret()) { $secret = $cles->getSecretAuth(); } @@ -155,7 +152,7 @@ // fait tourner le codage du pass dans la base // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() - if (!$phpauth and $secret) { + if (!$phpauth && $secret) { include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess $pass_hash_next = Password::hacher($pass, $secret); if ($pass_hash_next) { @@ -198,7 +195,7 @@ // En profiter pour verifier la securite de tmp/ // Si elle ne fonctionne pas a l'installation, prevenir - if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { + if (!verifier_htaccess(_DIR_TMP) && defined('_ECRIRE_INSTALL')) { return false; } } @@ -213,9 +210,6 @@ * * Si on a pas perdu le secret des auth (le fichier config/cle.php est toujouts la et contient la cle), la fonction ne fait rien * car réinitialiser le secret des auth invalide *tous* les mots de passe - * - * @param bool $force - * @return bool */ function auth_spip_initialiser_secret(bool $force = false): bool { $cles = SpipCles::instance(); @@ -243,8 +237,7 @@ spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR); // et on echoue car on ne veut pas que la situation reste telle quelle raler_fichier(_DIR_ETC . 'cles.php'); - } - else { + } else { spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR); } return false; @@ -272,11 +265,9 @@ return $flux; } - /** * Informer du droit de modifier ou non son login * - * @param string $serveur * @return bool * toujours true pour un auteur cree dans SPIP */ @@ -329,12 +320,12 @@ * @return bool */ function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') { - if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { + if ($new_login === null || auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { return false; } if ( - !$id_auteur = intval($id_auteur) - or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) + !($id_auteur = intval($id_auteur)) + || !($auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)) ) { return false; } @@ -375,50 +366,62 @@ * @return string */ function auth_spip_retrouver_login($login, $serveur = '') { - if (!strlen($login)) { + // pas la peine de requeter si le login est vide ou trop long + if (!strlen($login) || strlen($login) > 256) { return null; - } // pas la peine de requeter - $l = sql_quote($login, $serveur, 'text'); - if ( - $r = sql_getfetsel( - 'login', - 'spip_auteurs', - "statut<>'5poubelle'" . - ' AND (length(pass)>0)' . - " AND (login=$l)", - '', - '', - '', - '', - $serveur - ) - ) { - return $r; } - // Si pas d'auteur avec ce login - // regarder s'il a saisi son nom ou son mail. - // Ne pas fusionner avec la requete precedente - // car un nom peut etre homonyme d'un autre login - else { - return sql_getfetsel( - 'login', + $login_quoted = sql_quote($login, $serveur, 'text'); + // On cherche d'abord le login dans le champ login + // et sinon dans son mail ou son nom. + // On fait en 3 requetes différentes car un nom peut etre homonyme d'un autre login + $champs_login_possible = str_contains($login, '@') ? ['login', 'email', 'nom'] : ['login', 'nom']; + foreach ($champs_login_possible as $champ_login) { + $id_auteur = sql_getfetsel( + 'id_auteur', 'spip_auteurs', "statut<>'5poubelle'" . ' AND (length(pass)>0)' . - " AND (login<>'' AND (nom=$l OR email=$l))", + " AND $champ_login=" . $login_quoted, '', '', '', '', $serveur ); + if ($id_auteur) { + spip_log("auth_spip_retrouver_login: champ $champ_login auteur #$id_auteur correspond à $login_quoted", 'auth' . _LOG_DEBUG); + break; + } + } + + if (!$id_auteur) { + return null; } + + // on requète à nouveau sur la base du (int)id_auteur seul pour retrouver le login + // et on vérifie que l'égalité sur le champ était bien vraie + // ce qui rejette les égalités approximatives sur nom ou email qui sont des champs case insensitive + $auteur = sql_fetsel( + implode(',', array_unique(['login', $champ_login])), + 'spip_auteurs', + 'id_auteur=' . intval($id_auteur) . " AND statut<>'5poubelle' AND (length(pass)>0)", + '', + '', + '', + '', + $serveur + ); + + if ($auteur[$champ_login] === $login) { + return $auteur['login']; + } + + return null; } /** * Informer du droit de modifier ou non le pass * - * @param string $serveur * @return bool * toujours true pour un auteur cree dans SPIP */ @@ -430,7 +433,6 @@ return true; } - /** * Verification de la validite d'un mot de passe pour le mode d'auth concerne * c'est ici que se font eventuellement les verifications de longueur mini/maxi @@ -479,13 +481,13 @@ $id_auteur, $serveur = '' ) { - if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { + if ($new_pass === null || auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { return false; } if ( - !$id_auteur = intval($id_auteur) - or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) + !($id_auteur = intval($id_auteur)) + || !($auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)) ) { return false; } @@ -495,13 +497,11 @@ if (!$secret) { if (auth_spip_initialiser_secret()) { $secret = $cles->getSecretAuth(); - } - else { + } else { return false; } } - include_spip('inc/acces'); $set = [ 'pass' => Password::hacher($new_pass, $secret), @@ -512,7 +512,7 @@ ]; // si c'est un webmestre, on met a jour son backup des cles - if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') { + if ($auteur['statut'] === '0minirezo' && $auteur['webmestre'] === 'oui') { $set['backup_cles'] = $cles->backup($new_pass); } @@ -529,8 +529,6 @@ * @param array $champs * @param array $options * all=>true permet de demander la regeneration complete des acces apres operation en base (import, upgrade) - * @param string $serveur - * @return void */ function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void { // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess @@ -541,9 +539,9 @@ // regenerer les fichier htpass if ( isset($champs['login']) - or isset($champs['pass']) - or isset($champs['statut']) - or (isset($options['all']) and $options['all']) + || isset($champs['pass']) + || isset($champs['statut']) + || isset($options['all']) && $options['all'] ) { $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; $htpasswd = _DIR_TMP . _AUTH_USER_FILE; @@ -552,8 +550,7 @@ // par exemple acces_restreint ; // si .htaccess existe, outrepasser spip_meta if ( - (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) - and !@file_exists($htaccess) + (!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') && !@file_exists($htaccess) ) { spip_unlink($htpasswd); spip_unlink($htpasswd . '-admin'); @@ -573,7 +570,7 @@ sql_in('statut', ['1comite', '0minirezo', 'nouveau']) ); while ($t = sql_fetch($s)) { - if (strlen($t['login']) and strlen($t['htpass'])) { + if (strlen($t['login']) && strlen($t['htpass'])) { $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; if ($t['statut'] == '0minirezo') { $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; diff -Nru spip-4.4.23+dfsg/ecrire/balise/formulaire_.php spip-4.4.28+dfsg/ecrire/balise/formulaire_.php --- spip-4.4.23+dfsg/ecrire/balise/formulaire_.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/formulaire_.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,19 +1,17 @@ 0) { return array_map( - function($v) use ($max_prof) { - return protege_champ($v, $max_prof-1); - }, + fn ($v) => protege_champ($v, $max_prof - 1), $valeur ); } // si on dépasse la prof max on tronque return []; - } elseif ($valeur === null) { + } + if ($valeur === null) { return $valeur; - } elseif (is_bool($valeur)) { + } + if (is_bool($valeur)) { return $valeur ? '1' : ''; - } elseif (is_string($valeur) and $valeur) { + } + if (is_string($valeur) && $valeur) { if (strpbrk($valeur, "&\"'<>") !== false) { return spip_htmlspecialchars($valeur, ENT_QUOTES); } @@ -67,9 +66,9 @@ * @return string|bool * - string : chemin du squelette * - false : pas de squelette trouvé - **/ + */ function existe_formulaire($form) { - if (substr($form, 0, 11) == 'FORMULAIRE_') { + if (str_starts_with($form, 'FORMULAIRE_')) { $form = strtolower(substr($form, 11)); } else { $form = strtolower($form); @@ -95,7 +94,7 @@ // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn if ( function_exists('arguments_balise_dyn_depuis_modele') - and $form = arguments_balise_dyn_depuis_modele(null, 'read') + && ($form = arguments_balise_dyn_depuis_modele(null, 'read')) ) { if (in_array('balise_formulaire__dyn', $trace_fonctions)) { $k = array_search('balise_formulaire__dyn', $trace_fonctions); @@ -107,7 +106,7 @@ // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil, // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette - if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) { + if (in_array('eval', $trace_fonctions) && in_array('inclure_modele', $trace_fonctions)) { $k = array_search('inclure_modele', $trace_fonctions); // les arguments de recuperer_fond() passes par inclure_modele() return $trace[$k - 1]['args'][1]['args']; @@ -124,7 +123,7 @@ * Description de la balise formulaire * @return Champ * Description complétée du code compilé appelant la balise dynamique - **/ + */ function balise_FORMULAIRE__dist($p) { // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide. @@ -182,7 +181,7 @@ * @return array|string * array: contexte d'environnement à envoyer au squelette * string: Formulaire non applicable (message d’explication) - **/ + */ function balise_FORMULAIRE__contexte($form, $args) { // tester si ce formulaire vient d'etre poste (memes arguments) // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page @@ -190,10 +189,10 @@ $je_suis_poste = false; if ( - $post_form = _request('formulaire_action') - and $post_form == $form - and $p = _request('formulaire_action_args') - and is_array($p = decoder_contexte_ajax($p, $post_form)) + ($post_form = _request('formulaire_action')) + && $post_form == $form + && ($p = _request('formulaire_action_args')) + && is_array($p = decoder_contexte_ajax($p, $post_form)) ) { // enlever le faux attribut de langue masque array_shift($p); @@ -233,8 +232,8 @@ $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])); foreach (array_keys($valeurs) as $champ) { $champ = (string) $champ; - if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) { - if ($dispo and (($v = _request($champ)) !== null)) { + if ($champ[0] !== '_' && !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) { + if ($dispo && ($v = _request($champ)) !== null) { $valeurs[$champ] = $v; } // nettoyer l'url des champs qui vont etre saisis @@ -287,13 +286,9 @@ $valeurs['formulaire_sign'] = $secu['hash']; } - if (!isset($valeurs['id'])) { - $valeurs['id'] = 'new'; - } + $valeurs['id'] ??= 'new'; // editable peut venir de charger() ou de traiter() sinon - if (!isset($valeurs['editable'])) { - $valeurs['editable'] = $editable; - } + $valeurs['editable'] ??= $editable; // dans tous les cas, renvoyer un espace ou vide (et pas un booleen) $valeurs['editable'] = ($valeurs['editable'] ? ' ' : ''); @@ -315,7 +310,7 @@ // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ) if (html5_permis()) { foreach ($erreurs as $k => $v) { - if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) { + if (is_string($v) && strlen(trim($v)) && !str_starts_with($k, '_')) { // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form $valeurs['erreurs'][$k] = "" . $erreurs[$k] . ''; } @@ -345,12 +340,12 @@ 'formulaire_charger', [ 'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], - 'data' => $valeurs + 'data' => $valeurs, ] ); // prise en charge CVT multi etape - if (is_array($valeurs) and isset($valeurs['_etapes'])) { + if (is_array($valeurs) && isset($valeurs['_etapes'])) { include_spip('inc/cvt_multietapes'); $valeurs = cvtmulti_formulaire_charger_etapes( ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], @@ -360,9 +355,7 @@ // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline ! if (is_array($valeurs)) { - if (!isset($valeurs['_pipelines'])) { - $valeurs['_pipelines'] = []; - } + $valeurs['_pipelines'] ??= []; // l'ancien argument _pipeline devient maintenant _pipelines // reinjectons le vieux _pipeline au debut de _pipelines if (isset($valeurs['_pipeline'])) { diff -Nru spip-4.4.23+dfsg/ecrire/balise/formulaire_admin.php spip-4.4.28+dfsg/ecrire/balise/formulaire_admin.php --- spip-4.4.23+dfsg/ecrire/balise/formulaire_admin.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/formulaire_admin.php 2026-10-07 13:48:22.000000000 +0000 @@ -13,10 +13,7 @@ /** * Ce fichier gère la balise dynamique `#FORMULAIRE_ADMIN` - * - * @package SPIP\Core\Formulaires - **/ - + */ if (!defined('_ECRIRE_INC_VERSION')) { return; } @@ -41,7 +38,7 @@ * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé - **/ + */ function balise_FORMULAIRE_ADMIN($p) { return calculer_balise_dynamique($p, 'FORMULAIRE_ADMIN', []); } @@ -63,7 +60,6 @@ return $args; } - /** * Retourne le squelette d'affichage et le contexte de la balise FORMULAIRE_ADMIN * @@ -82,7 +78,7 @@ * Informations sur la page contenant une erreur de compilation * @return array|string * Liste : Chemin du squelette, durée du cache, contexte - **/ + */ function balise_FORMULAIRE_ADMIN_dyn($float = '', $debug = '') { static $dejafait = false; @@ -100,7 +96,7 @@ return ''; } foreach ($debug['sourcefile'] as $k => $v) { - if (strpos($v, 'administration.') !== false) { + if (str_contains($v, 'administration.')) { if (isset($debug['resultat'][$k . 'tout'])) { return $debug['resultat'][$k . 'tout']; } @@ -114,7 +110,6 @@ include_spip('inc/autoriser'); include_spip('base/abstract_sql'); - $dejafait = true; // Preparer le #ENV des boutons @@ -129,9 +124,9 @@ $env['divclass'] = $float; $env['lang'] = admin_lang(); $env['calcul'] = (_request('var_mode') ? 'recalcul' : 'calcul'); - $env['debug'] = ((defined('_VAR_PREVIEW') and _VAR_PREVIEW) ? '' : admin_debug()); - $env['analyser'] = (!$env['debug'] and !$GLOBALS['xhtml']) ? '' : admin_valider(); - $env['inclure'] = ((defined('_VAR_INCLURE') and _VAR_INCLURE) ? 'inclure' : ''); + $env['debug'] = ((defined('_VAR_PREVIEW') && _VAR_PREVIEW) ? '' : admin_debug()); + $env['analyser'] = (!$env['debug'] && !$GLOBALS['xhtml']) ? '' : admin_valider(); + $env['inclure'] = ((defined('_VAR_INCLURE') && _VAR_INCLURE) ? 'inclure' : ''); if (empty($GLOBALS['use_cache'])) { $env['use_cache'] = ' *'; @@ -146,7 +141,6 @@ return ['formulaires/administration', 0, $env]; } - /** * Préparer le contexte d'environnement pour les boutons * @@ -159,7 +153,7 @@ * * @return array * Tableau de l'environnement calculé - **/ + */ function admin_objet() { include_spip('inc/urls'); $env = []; @@ -173,12 +167,12 @@ $type = $obj; if ( $type == objet_type($type, false) - and $_id_type = id_table_objet($type) - and isset($GLOBALS['contexte'][$_id_type]) - and $id = $GLOBALS['contexte'][$_id_type] - and !is_array($id) - and $id = intval($id) - and $desc = $trouver_table(table_objet_sql($type)) + && ($_id_type = id_table_objet($type)) + && isset($GLOBALS['contexte'][$_id_type]) + && ($id = $GLOBALS['contexte'][$_id_type]) + && !is_array($id) + && ($id = intval($id)) + && ($desc = $trouver_table(table_objet_sql($type))) ) { $id = sql_getfetsel($_id_type, table_objet_sql($type), "$_id_type=" . intval($id)); if ($id) { @@ -189,7 +183,7 @@ str_replace('&', '&', generer_objet_url($id, $obj, '', '', false)); if ( isset($desc['field']['id_rubrique']) - and $type != 'rubrique' + && $type != 'rubrique' ) { unset($env['id_rubrique']); unset($env['voir_rubrique']); @@ -204,7 +198,6 @@ return $env; } - /** * Détermine si l'élément est previsualisable * @@ -217,9 +210,9 @@ * @return string|array * - Chaine vide si on est déjà en prévisu ou si pas de previsualisation possible * - Tableau d'un élément sinon. - **/ + */ function admin_preview($type, $id, $desc = null) { - if (defined('_VAR_PREVIEW') and _VAR_PREVIEW) { + if (defined('_VAR_PREVIEW') && _VAR_PREVIEW) { return ''; } @@ -227,7 +220,7 @@ $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table(table_objet_sql($type)); } - if (!$desc or !isset($desc['field']['statut'])) { + if (!$desc || !isset($desc['field']['statut'])) { return ''; } @@ -238,20 +231,19 @@ $notpub = sql_in('statut', ['prop', 'prive']); - if ($type == 'article' and $GLOBALS['meta']['post_dates'] != 'oui') { + if ($type == 'article' && $GLOBALS['meta']['post_dates'] != 'oui') { $notpub .= " OR (statut='publie' AND date>" . sql_quote(date('Y-m-d H:i:s')) . ')'; } return sql_fetsel('1', table_objet_sql($type), id_table_objet($type) . '=' . $id . " AND ($notpub)"); } - /** * Régler les boutons dans la langue de l'admin (sinon tant pis) * * @return string * Code de langue - **/ + */ function admin_lang() { $alang = ''; if (!empty($_COOKIE['spip_admin'])) { @@ -278,30 +270,26 @@ * Retourne une URL vers un validateur * * @return string - **/ + */ function admin_valider() { - - return ((!isset($GLOBALS['xhtml']) or $GLOBALS['xhtml'] !== 'true') ? - (parametre_url(self(), 'var_mode', 'debug', '&') - . '&var_mode_affiche=validation') : - ('http://validator.w3.org/check?uri=' - . rawurlencode('http://' . $_SERVER['HTTP_HOST'] . nettoyer_uri()))); + return (!isset($GLOBALS['xhtml']) || $GLOBALS['xhtml'] !== 'true') + ? (parametre_url(self(), 'var_mode', 'debug', '&') + . '&var_mode_affiche=validation') + : ('http://validator.w3.org/check?uri=' + . rawurlencode('http://' . $_SERVER['HTTP_HOST'] . nettoyer_uri())); } /** * Retourne une URL vers le mode debug, si l'utilisateur a le droit, et si c'est utile * * @return string - **/ + */ function admin_debug() { - return (( - (isset($GLOBALS['forcer_debug']) and $GLOBALS['forcer_debug']) - or (isset($GLOBALS['bouton_admin_debug']) and $GLOBALS['bouton_admin_debug']) - or ( - defined('_VAR_MODE') and _VAR_MODE == 'debug' - and isset($_COOKIE['spip_debug']) and $_COOKIE['spip_debug'] - ) - ) and autoriser('debug') + return ( + (isset($GLOBALS['forcer_debug']) && $GLOBALS['forcer_debug'] + || isset($GLOBALS['bouton_admin_debug']) && $GLOBALS['bouton_admin_debug'] + || defined('_VAR_MODE') && _VAR_MODE == 'debug' && isset($_COOKIE['spip_debug']) && $_COOKIE['spip_debug']) && autoriser('debug') ) - ? parametre_url(self(), 'var_mode', 'debug', '&') : ''; + ? parametre_url(self(), 'var_mode', 'debug', '&') + : ''; } diff -Nru spip-4.4.23+dfsg/ecrire/balise/formulaire_ecrire_auteur.php spip-4.4.28+dfsg/ecrire/balise/formulaire_ecrire_auteur.php --- spip-4.4.23+dfsg/ecrire/balise/formulaire_ecrire_auteur.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/formulaire_ecrire_auteur.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ 'FORMULAIRE_ECRIRE_AUTEUR', - 'motif' => 'AUTEURS/ARTICLES' - ] + 'motif' => 'AUTEURS/ARTICLES', + ], ]; erreur_squelette($msg, $context_compil); @@ -76,7 +73,7 @@ } // Si on est dans un contexte article, // sortir tous les mails des auteurs de l'article - if (!$args[0] and $id) { + if (!$args[0] && $id) { $r = ''; $s = sql_allfetsel( 'email', @@ -92,7 +89,7 @@ } // On ne peut pas ecrire a un auteur dont le mail n'est pas valide - if (!$args[2] or !email_valide($args[2])) { + if (!$args[2] || !email_valide($args[2])) { return ''; } diff -Nru spip-4.4.23+dfsg/ecrire/balise/formulaire_inscription.php spip-4.4.28+dfsg/ecrire/balise/formulaire_inscription.php --- spip-4.4.23+dfsg/ecrire/balise/formulaire_inscription.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/formulaire_inscription.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ intval($id_ou_options)]; $id = $options['id']; - }else { + } else { $options = $id_ou_options; $id = (int) ($id_ou_options['id'] ?? 0); } diff -Nru spip-4.4.23+dfsg/ecrire/balise/id_logo_.php spip-4.4.28+dfsg/ecrire/balise/id_logo_.php --- spip-4.4.23+dfsg/ecrire/balise/id_logo_.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/id_logo_.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,25 +1,21 @@ id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : ''; if ($type == 'document') { @@ -96,8 +90,6 @@ * Type d'objet * @param string $align * Alignement demandé du logo - * @param string $lien - * Lien pour encadrer l'image avec si présent * @param Spip\Compilateur\Noeud\Champ $p * Pile au niveau de la balise * @param string $suite @@ -106,7 +98,7 @@ * 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 = "''"; @@ -126,7 +118,7 @@ $code = "quete_logo('$id_objet', '$onoff', $_id_objet, $_id_rubrique)"; if ($champ) { - return "table_valeur($code, '".addslashes($champ)."')"; + return "table_valeur($code, '" . addslashes($champ) . "')"; } $align = preg_replace(',\W,', '', $align); diff -Nru spip-4.4.23+dfsg/ecrire/balise/info_.php spip-4.4.28+dfsg/ecrire/balise/info_.php --- spip-4.4.23+dfsg/ecrire/balise/info_.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/info_.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ nom_champ; $type_objet = interprete_argument_balise(1, $p); $id_objet = interprete_argument_balise(2, $p); - if ($info === 'INFO_' or !$type_objet or !$id_objet) { + if ($info === 'INFO_' || !$type_objet || !$id_objet) { $msg = _T('zbug_balise_sans_argument', ['balise' => ' INFO_']); erreur_squelette($msg, $p); $p->interdire_scripts = true; diff -Nru spip-4.4.23+dfsg/ecrire/balise/logo_.php spip-4.4.28+dfsg/ecrire/balise/logo_.php --- spip-4.4.23+dfsg/ecrire/balise/logo_.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/logo_.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,25 +1,21 @@ etoile === '**') ? -1 : 0; $coord = []; $align = $lien = ''; $mode_logo = ''; - if ($p->param and !$p->param[0][0]) { + if ($p->param && !$p->param[0][0]) { $params = $p->param[0]; array_shift($params); foreach ($params as $a) { @@ -131,7 +125,7 @@ } // demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0} - if ($coord_x or $coord_y) { + if ($coord_x || $coord_y) { $code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))"; } diff -Nru spip-4.4.23+dfsg/ecrire/balise/menu_lang.php spip-4.4.28+dfsg/ecrire/balise/menu_lang.php --- spip-4.4.23+dfsg/ecrire/balise/menu_lang.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/menu_lang.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $default) { + if ($GLOBALS['spip_lang'] != $default) { $opt = lang_select($default); # et remplace - if ($GLOBALS['spip_lang'] <> $default) { + if ($GLOBALS['spip_lang'] != $default) { $default = ''; # annule tout choix par defaut if ($opt) { lang_select(); @@ -120,6 +117,6 @@ 'url' => $post, 'name' => $nom, 'default' => $default, - ] + ], ]; } diff -Nru spip-4.4.23+dfsg/ecrire/balise/url_.php spip-4.4.28+dfsg/ecrire/balise/url_.php --- spip-4.4.23+dfsg/ecrire/balise/url_.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/url_.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ interdire_scripts = false; return $p; - } elseif ($f = charger_fonction($nom, 'balise', true)) { + } + if ($f = charger_fonction($nom, 'balise', true)) { return $f($p); } else { $nom = strtolower($nom); @@ -149,7 +146,7 @@ * * @balise * @uses generer_generer_url() - * @link https://www.spip.net/3963 + * @see https://www.spip.net/3963 * @example * ``` * #URL_ARTICLE @@ -187,7 +184,7 @@ * @balise * @uses generer_generer_url() * @see calculer_url() - * @link https://www.spip.net/3861 + * @see https://www.spip.net/3861 * * @param Champ $p * Pile au niveau de la balise @@ -220,7 +217,7 @@ * telle que définie dans la configuration * * @balise - * @link https://www.spip.net/4623 + * @see https://www.spip.net/4623 * * @param Champ $p * Pile au niveau de la balise @@ -235,7 +232,6 @@ return $p; } - /** * Compile la balise `#URL_PAGE` qui retourne une URL de type « page » * @@ -245,7 +241,7 @@ * - `#URL_PAGE*` retourne l'URL sans convertir les `&` en `&` * * @balise - * @link https://www.spip.net/4630 + * @see https://www.spip.net/4630 * @see generer_url_public() * @example * ``` @@ -271,7 +267,7 @@ // si une fonction de generation des url a ete definie pour ce connect l'utiliser // elle devra aussi traiter le cas derogatoire type=page if (function_exists($f = 'generer_generer_url_' . $s)) { - if ($args and $args !== "''") { + if ($args && $args !== "''") { $code .= ", $args"; } $code = $f('page', $code, $s); @@ -279,7 +275,7 @@ return $p; } $s = 'connect=' . addslashes($s); - $args = (($args and $args !== "''") ? "$args . '&$s'" : "'$s'"); + $args = (($args && $args !== "''") ? "$args . '&$s'" : "'$s'"); } if (!$code) { @@ -295,11 +291,10 @@ $p->code = $code; spip_log("Calcul url page : connect vaut $s ca donne :" . $p->code . " args $args", _LOG_INFO); - #$p->interdire_scripts = true; + # $p->interdire_scripts = true; return $p; } - /** * Compile la balise `#URL_ECRIRE` qui retourne une URL d'une page de l'espace privé * @@ -309,7 +304,7 @@ * - `#URL_ECRIRE*` retourne l'URL sans convertir les `&` en `&` * * @balise - * @link https://www.spip.net/5566 + * @see https://www.spip.net/5566 * @see generer_url_ecrire() * @example * ``` @@ -329,11 +324,9 @@ } else { $fonc = $code; $args = interprete_argument_balise(2, $p); - if ($args === null) { - $args = "''"; - } + $args ??= "''"; $noentities = $p->etoile ? ', true' : ''; - if (($args != "''") or $noentities) { + if ($args != "''" || $noentities) { $fonc .= ",$args$noentities"; } } @@ -343,7 +336,6 @@ return $p; } - /** * Compile la balise `#URL_ACTION_AUTEUR` qui retourne une URL d'action * sécurisée pour l'auteur en cours diff -Nru spip-4.4.23+dfsg/ecrire/balise/url_logout.php spip-4.4.28+dfsg/ecrire/balise/url_logout.php --- spip-4.4.23+dfsg/ecrire/balise/url_logout.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/balise/url_logout.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ utf8 etc. $desc = sql_serveur('', $serveur, true); @@ -151,7 +147,6 @@ return false; } - /** * Regler le codage de connexion * @@ -172,17 +167,16 @@ * * @return bool * Retourne true si elle reussie. - **/ + */ function sql_set_charset($charset, $serveur = '', $option = true) { - $f = sql_serveur('set_charset', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('set_charset', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } return $f($charset, $serveur, $option !== false); } - /** * Effectue une requête de selection * @@ -216,7 +210,6 @@ * Le cas array est, pour une requete produite par le compilateur, * un tableau donnnant le contexte afin d'indiquer le lieu de l'erreur au besoin * - * * @return mixed * Ressource SQL * @@ -227,8 +220,7 @@ * Retourne false en cas d'erreur, apres l'avoir denoncee. * Les portages doivent retourner la requete elle-meme en cas d'erreur, * afin de disposer du texte brut. - * - **/ + */ function sql_select( $select = [], $from = [], @@ -240,13 +232,13 @@ $serveur = '', $option = true ) { - $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('select', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } - $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug'); - if (($option !== false) and !$debug) { + $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); + if ($option !== false && !$debug) { $res = $f( $select, $from, @@ -265,7 +257,7 @@ } // le debug, c'est pour ce qui a ete produit par le compilateur if (isset($GLOBALS['debug']['aucasou'])) { - [$table, $id, ] = $GLOBALS['debug']['aucasou']; + [$table, $id] = $GLOBALS['debug']['aucasou']; $nom = $GLOBALS['debug_objets']['courant'] . $id; $GLOBALS['debug_objets']['requete'][$nom] = $query; } @@ -285,7 +277,6 @@ return false; } - /** * Recupere la syntaxe de la requete select sans l'executer * @@ -316,8 +307,7 @@ * @return mixed * Chaine contenant la requete * ou false en cas d'erreur - * - **/ + */ function sql_get_select( $select = [], $from = [], @@ -331,7 +321,6 @@ return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); } - /** * Retourne le nombre de lignes d'une sélection * @@ -369,8 +358,7 @@ * @return int|bool * - Nombre de lignes de resultat * - ou false en cas d'erreur - * - **/ + */ function sql_countsel( $from = [], $where = [], @@ -379,8 +367,8 @@ $serveur = '', $option = true ) { - $f = sql_serveur('countsel', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('countsel', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($from, $where, $groupby, $having, $serveur, $option !== false); @@ -418,10 +406,10 @@ * - false en cas de serveur indiponible ou d'erreur * * Ce retour n'est pas pertinent pour savoir si l'opération est correctement réalisée. - **/ + */ function sql_alter($q, $serveur = '', $option = true) { - $f = sql_serveur('alter', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('alter', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($q, $serveur, $option !== false); @@ -452,15 +440,14 @@ * presentant une ligne de resultat d'une selection */ function sql_fetch($res, $serveur = '', $option = true) { - $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } return $f($res, null, $serveur, $option !== false); } - /** * Retourne tous les enregistrements d'une selection * @@ -488,8 +475,8 @@ if (!$res) { return $rows; } - $f = sql_serveur('fetch', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return []; } while ($r = $f($res, null, $serveur, $option !== false)) { @@ -523,10 +510,10 @@ * * @return bool * Operation effectuée (true), sinon false. - **/ + */ function sql_seek($res, $row_number, $serveur = '', $option = true) { - $f = sql_serveur('seek', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('seek', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($res, $row_number, $serveur, $option !== false); @@ -537,7 +524,6 @@ return $r; } - /** * Liste des bases de donnees accessibles * @@ -557,10 +543,10 @@ * @return array|bool * Tableau contenant chaque nom de base de donnees. * False en cas d'erreur. - **/ + */ function sql_listdbs($serveur = '', $option = true) { - $f = sql_serveur('listdbs', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('listdbs', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($serveur); @@ -571,7 +557,6 @@ return $r; } - /** * Demande d'utiliser d'une base de donnees * @@ -589,10 +574,10 @@ * @return bool|string * - True ou nom de la base en cas de success. * - False en cas d'erreur. - **/ + */ function sql_selectdb($nom, $serveur = '', $option = true) { - $f = sql_serveur('selectdb', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('selectdb', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($nom, $serveur, $option !== false); @@ -611,7 +596,7 @@ * @see sql_select() * @see sql_countsel() * - * @param Object $res + * @param object $res * Ressource SQL * @param string $serveur * Nom du connecteur @@ -623,10 +608,10 @@ * @return bool|string * - int Nombre de lignes, * - false en cas d'erreur. - **/ + */ function sql_count($res, $serveur = '', $option = true) { - $f = sql_serveur('count', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('count', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($res, $serveur, $option !== false); @@ -643,7 +628,7 @@ * Indique au gestionnaire SQL de libérer de sa mémoire la ressoucre de * résultat indiquée car on n'a plus besoin de l'utiliser. * - * @param Object $res + * @param object $res * Ressource de résultat * @param string $serveur * Nom de la connexion @@ -656,15 +641,14 @@ * True si réussi */ function sql_free($res, $serveur = '', $option = true) { - $f = sql_serveur('free', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('free', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } return $f($res); } - /** * Insère une ligne dans une table * @@ -697,14 +681,14 @@ * - int|true identifiant de l'élément inséré (si possible), ou true, si réussite * - texte de la requête si demandé, * - False en cas d'erreur. - **/ + */ function sql_insert($table, $noms, $valeurs, $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('insert', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('insert', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false); - if ($r === false or $r === null) { + if ($r === false || $r === null) { spip_sql_erreur($serveur); $r = false; } @@ -748,14 +732,14 @@ * - int|true identifiant de l'élément inséré (si possible), ou true, si réussite * - texte de la requête si demandé, * - False en cas d'erreur. - **/ + */ function sql_insertq($table, $couples = [], $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('insertq', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('insertq', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $couples, $desc, $serveur, $option !== false); - if ($r === false or $r === null) { + if ($r === false || $r === null) { spip_sql_erreur($serveur); $r = false; } @@ -793,14 +777,14 @@ * - true en cas de succès, * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_insertq_multi($table, $couples = [], $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $couples, $desc, $serveur, $option !== false); - if ($r === false or $r === null) { + if ($r === false || $r === null) { spip_sql_erreur($serveur); $r = false; } @@ -845,8 +829,8 @@ * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ function sql_update($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('update', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('update', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); @@ -857,7 +841,6 @@ return $r; } - /** * Met à jour du contenu d’une table SQL * @@ -898,10 +881,10 @@ * - true si réussite * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_updateq($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('updateq', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('updateq', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); @@ -938,10 +921,10 @@ * - int : nombre de suppressions réalisées, * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_delete($table, $where = '', $serveur = '', $option = true) { - $f = sql_serveur('delete', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('delete', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $where, $serveur, $option !== false); @@ -983,10 +966,10 @@ * - true si réussite * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_replace($table, $couples, $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('replace', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('replace', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $couples, $desc, $serveur, $option !== false); @@ -997,7 +980,6 @@ return $r; } - /** * Insère où met à jour des entrées d’une table SQL * @@ -1030,10 +1012,10 @@ * - true si réussite * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $option = true) { - $f = sql_serveur('replace_multi', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('replace_multi', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $tab_couples, $desc, $serveur, $option !== false); @@ -1067,10 +1049,10 @@ * - true en cas de succès, * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_drop_table($table, $exist = '', $serveur = '', $option = true) { - $f = sql_serveur('drop_table', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('drop_table', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $exist, $serveur, $option !== false); @@ -1102,8 +1084,8 @@ * - true si la requête a réussie, false sinon */ function sql_drop_view($table, $exist = '', $serveur = '', $option = true) { - $f = sql_serveur('drop_view', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('drop_view', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $exist, $serveur, $option !== false); @@ -1133,10 +1115,10 @@ * - true -> executer la requete. * @return object|bool|string * Ressource à utiliser avec sql_fetch() - **/ + */ function sql_showbase($spip = null, $serveur = '', $option = true) { - $f = sql_serveur('showbase', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('showbase', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } @@ -1167,7 +1149,7 @@ * - true -> executer la requete. * @return array * Liste des tables SQL - **/ + */ function sql_alltable($spip = null, $serveur = '', $option = true) { $q = sql_showbase($spip, $serveur, $option); $r = []; @@ -1208,10 +1190,10 @@ * - 'field' => array(colonne => description) * - 'key' => array(type => key) * - 'join' => array() // jointures, si déclarées. - **/ + */ function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) { - $f = sql_serveur('showtable', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('showtable', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } @@ -1237,7 +1219,6 @@ return $f; } - /** * Teste si une table SQL existe ou non dans la base * @@ -1245,7 +1226,7 @@ * * @param string $table * Nom de la table -* @param bool $table_spip + * @param bool $table_spip * true pour remplacer automatiquement « spip » par le vrai préfixe de table * @param string $serveur * Nom du connecteur @@ -1259,10 +1240,10 @@ * - true si la table existe, * - texte de la requête si demandé, * - false en cas d'erreur. - **/ + */ function sql_table_exists(string $table, bool $table_spip = true, $serveur = '', $option = true) { - $f = sql_serveur('table_exists', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('table_exists', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } @@ -1278,7 +1259,6 @@ return $f($vraie_table, $serveur, $option !== false); } - /** * Crée une table dans la base de données * @@ -1319,7 +1299,7 @@ * - true : exécuter la requete. * @return bool * true si succès, false en cas d'echec - **/ + */ function sql_create( $nom, $champs, @@ -1329,8 +1309,8 @@ $serveur = '', $option = true ) { - $f = sql_serveur('create', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('create', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false); @@ -1354,10 +1334,10 @@ * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool true si la base est créee. - **/ + */ function sql_create_base($nom, $serveur = '', $option = true) { - $f = sql_serveur('create_base', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('create_base', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($nom, $serveur, $option !== false); @@ -1368,7 +1348,6 @@ return $r; } - /** * Crée une vue SQL * @@ -1393,10 +1372,10 @@ * - true si succès, * - texte de la requête si demandé * - false en cas d'échec. - **/ + */ function sql_create_view($nom, $select_query, $serveur = '', $option = true) { - $f = sql_serveur('create_view', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('create_view', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($nom, $select_query, $serveur, $option !== false); @@ -1433,15 +1412,14 @@ * texte de sélection pour la requête */ function sql_multi($sel, $lang, $serveur = '', $option = true) { - $f = sql_serveur('multi', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('multi', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } return $f($sel, $lang); } - /** * Retourne la dernière erreur connue * @@ -1454,7 +1432,7 @@ */ function sql_error($serveur = '') { $f = sql_serveur('error', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } @@ -1473,7 +1451,7 @@ */ function sql_errno($serveur = '') { $f = sql_serveur('errno', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } @@ -1496,7 +1474,7 @@ */ function sql_explain($q, $serveur = '', $option = true) { $f = sql_serveur('explain', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } $r = $f($q, $serveur, $option !== false); @@ -1522,8 +1500,8 @@ * @return bool Toujours true */ function sql_optimize($table, $serveur = '', $option = true) { - $f = sql_serveur('optimize', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('optimize', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $serveur, $option !== false); @@ -1551,8 +1529,8 @@ * - true si la requête a réussie, false sinon */ function sql_repair($table, $serveur = '', $option = true) { - $f = sql_serveur('repair', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('repair', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($table, $serveur, $option !== false); @@ -1563,7 +1541,6 @@ return $r; } - /** * Exécute une requête SQL * @@ -1585,8 +1562,8 @@ * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ function sql_query($ins, $serveur = '', $option = true) { - $f = sql_serveur('query', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('query', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } $r = $f($ins, $serveur, $option !== false); @@ -1639,8 +1616,7 @@ * @return array|string|false * Tableau de la premiere ligne de resultat de la selection tel que * `array('id_rubrique' => 1, 'id_secteur' => 2)` - * - **/ + */ function sql_fetsel( $select = [], $from = [], @@ -1665,7 +1641,6 @@ return $r; } - /** * Retourne le tableau de toutes les lignes d'une selection * @@ -1707,17 +1682,15 @@ * @return array * Tableau de toutes les lignes de resultat de la selection * Chaque entree contient un tableau des elements demandees dans le SELECT. - * {@example - * ``` + * {@example * ``` * array( * array('id_rubrique' => 1, 'id_secteur' => 2) * array('id_rubrique' => 4, 'id_secteur' => 2) * ... * ) * ``` - * } - * - **/ + *} + */ function sql_allfetsel( $select = [], $from = [], @@ -1737,7 +1710,6 @@ return sql_fetch_all($q, $serveur, $option); } - /** * Retourne un unique champ d'une selection * @@ -1778,8 +1750,7 @@ * @return mixed * Contenu de l'unique valeur demandee du premier enregistrement retourne * ou NULL si la requete ne retourne aucun enregistrement - * - **/ + */ function sql_getfetsel( $select, $from = [], @@ -1823,11 +1794,11 @@ * * @return string * Numero de version du serveur SQL - **/ + */ function sql_version($serveur = '', $option = true) { $row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur); - return ($row['n']); + return $row['n']; } /** @@ -1861,10 +1832,10 @@ * * @return bool * Le serveur SQL prefere t'il des transactions pour les insertions multiples ? - **/ + */ function sql_preferer_transaction($serveur = '', $option = true) { $f = sql_serveur('preferer_transaction', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } $r = $f($serveur, $option !== false); @@ -1875,8 +1846,6 @@ return $r; } -; - /** * Démarre une transaction * @@ -1895,10 +1864,10 @@ * @return bool * true si la transaction est demarree * false en cas d'erreur - **/ + */ function sql_demarrer_transaction($serveur = '', $option = true) { $f = sql_serveur('demarrer_transaction', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } $r = $f($serveur, $option !== false); @@ -1909,8 +1878,6 @@ return $r; } -; - /** * Termine une transaction * @@ -1929,10 +1896,10 @@ * @return bool * true si la transaction est demarree * false en cas d'erreur - **/ + */ function sql_terminer_transaction($serveur = '', $option = true) { $f = sql_serveur('terminer_transaction', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } $r = $f($serveur, $option !== false); @@ -1943,9 +1910,6 @@ return $r; } -; - - /** * Prépare une chaine hexadécimale * @@ -1965,10 +1929,10 @@ * - 'continue' pour ne pas échouer en cas de serveur SQL indisponible. * @return string * Valeur hexadécimale attendue par le serveur SQL - **/ + */ function sql_hex($val, $serveur = '', $option = true) { - $f = sql_serveur('hex', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('hex', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } @@ -1996,10 +1960,10 @@ * Exemple : `int NOT NULL` qui sert alors aussi à calculer le type d'échappement * @return string * La chaine echappee - **/ + */ function sql_quote($val, $serveur = '', $type = '') { $f = sql_serveur('quote', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { $f = '_q'; } @@ -2026,10 +1990,10 @@ * @return string|bool * - string : Expression SQL * - false si le serveur SQL est indisponible - **/ + */ function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) { $f = sql_serveur('date_proche', $serveur, true); - if (!is_string($f) or !$f) { + if (!is_string($f) || !$f) { return false; } @@ -2067,24 +2031,24 @@ * - true ou false -> retourne l'expression * @return string * Expression de requête SQL - **/ + */ function sql_in_quote($champ, $valeurs, $not = '', $serveur = '', $type = '', $option = true) { $quote = sql_serveur('quote', $serveur, true); - if (!is_string($quote) or !$quote) { + if (!is_string($quote) || !$quote) { return false; } // sql_quote produit une chaine dans tous les cas - $valeurs = array_filter($valeurs, fn($v) => !is_array($v)); + $valeurs = array_filter($valeurs, fn ($v) => !is_array($v)); $valeurs = array_unique($valeurs); $valeurs = $quote($valeurs, $type); if (!strlen(trim($valeurs))) { - return ($not ? '0=0' : '0=1'); + return $not ? '0=0' : '0=1'; } - $f = sql_serveur('in', $serveur, $option === 'continue' or $option === false); - if (!is_string($f) or !$f) { + $f = sql_serveur('in', $serveur, $option === 'continue' || $option === false); + if (!is_string($f) || !$f) { return false; } @@ -2108,7 +2072,7 @@ $type = ''; if (!is_array($valeurs)) { $valeurs = strval($valeurs); - if (isset($valeurs[0]) and $valeurs[0] === ',') { + if (isset($valeurs[0]) && $valeurs[0] === ',') { $valeurs = substr($valeurs, 1); } // on explode en tableau pour pouvoir securiser le contenu @@ -2120,8 +2084,6 @@ return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option); } - - /** * Retourne une expression IN pour le gestionnaire de base de données * à partir d'une sélection de données @@ -2156,7 +2118,7 @@ * Nom du connecteur * @return string * Expression de requête SQL - **/ + */ function sql_in_select( $in, $select, @@ -2187,7 +2149,7 @@ * * @see sql_seek() * - * @param Object $res + * @param object $res * Ressource issue d'une selection sql_select * @param int $pos * position courante @@ -2224,7 +2186,7 @@ if (sql_seek($res, $seek)) { $pos = $seek; } else { - while ($pos < $seek and sql_fetch($res, $serveur, $option)) { + while ($pos < $seek && sql_fetch($res, $serveur, $option)) { $pos++; } } @@ -2232,7 +2194,6 @@ return $pos; } - /** * Teste qu'une description de champ SQL est de type entier * @@ -2278,7 +2239,7 @@ * qui ne sait pas gerer les dates < 1970 * * @api - * @param int $annee Annee + * @param int $annee * @param int $mois Numero du mois * @param int $jour Numero du jour dans le mois * @param int $h Heures @@ -2305,7 +2266,6 @@ . sprintf('%02u', $m) . ':' . sprintf('%02u', $s); } - /** * Retourne la description de la table SQL * @@ -2322,7 +2282,7 @@ * Nom du connecteur * @return array|bool * Description de la table ou false si elle n'est pas trouvee ou declaree. - **/ + */ function description_table($nom, $serveur = '') { static $trouver_table; @@ -2346,11 +2306,8 @@ } include_spip('base/auxiliaires'); - if (isset($GLOBALS['tables_auxiliaires'][$nom])) { - return $GLOBALS['tables_auxiliaires'][$nom]; - } - return false; + return $GLOBALS['tables_auxiliaires'][$nom] ?? false; } /** diff -Nru spip-4.4.23+dfsg/ecrire/base/auxiliaires.php spip-4.4.28+dfsg/ecrire/base/auxiliaires.php --- spip-4.4.23+dfsg/ecrire/base/auxiliaires.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/auxiliaires.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,13 +1,13 @@ page(_T( - 'titre_probleme_technique'), + echo $minipage->page( + _T( + 'titre_probleme_technique' + ), [ 'titre' => _T('info_travaux_titre'), 'status' => 503, @@ -272,7 +268,7 @@ // pour ne pas declarer tout indisponible d'un coup // si en cours d'installation ou si db=@test@ on ne pose rien // car c'est un test de connexion - if (!defined('_ECRIRE_INSTALL') and $db !== '@test@') { + if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') { $f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out'; } elseif ($db == '@test@') { $db = ''; @@ -280,8 +276,8 @@ if ( $f - and @file_exists($f) - and (time() - @filemtime($f) < _CONNECT_RETRY_DELAY) + && @file_exists($f) + && time() - @filemtime($f) < _CONNECT_RETRY_DELAY ) { spip_log("Echec : $f recent. Pas de tentative de connexion", _LOG_HS); @@ -317,7 +313,6 @@ return null; } - /** * Première connexion au serveur principal de base de données * @@ -344,9 +339,9 @@ * - false si pas de charset connu pour la connexion * - -1 charset non renseigné * - nom du charset sinon - **/ + */ function spip_connect_main($connexion, $charset_sql_connexion = '') { - if ($GLOBALS['spip_connect_version'] < 0.1 and _DIR_RESTREINT) { + if ($GLOBALS['spip_connect_version'] < 0.1 && _DIR_RESTREINT) { include_spip('inc/headers'); redirige_url_ecrire('upgrade', 'reinstall=oui'); } @@ -361,8 +356,7 @@ // sinon on regarde la table spip_meta // en cas d'erreur select retourne la requette (is_string=true donc) if ( - !$r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'") - or is_string($r) + !($r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'")) || is_string($r) ) { return false; } @@ -403,15 +397,18 @@ * * @param int|float|string|array $a Valeur à échapper * @return string Valeur échappée. - **/ + */ function _q($a): string { if (is_numeric($a)) { return strval($a); - } elseif (is_array($a)) { + } + if (is_array($a)) { return join(',', array_map('_q', $a)); - } elseif (is_scalar($a)) { - return ("'" . addslashes($a) . "'"); - } elseif ($a === null) { + } + if (is_scalar($a)) { + return "'" . addslashes($a) . "'"; + } + if ($a === null) { return "''"; } throw new \RuntimeException('Can’t use _q with ' . gettype($a)); @@ -428,13 +425,13 @@ * * @param string $query * @return array + * @deprecated */ function query_echappe_textes($query, $uniqid = null) { + trigger_deprecation('spip', '4.4', 'Using "%s" is deprecated, use "%s" instead', __FUNCTION__, 'Spip\Texte\Collecteur\QuotedStrings'); static $codeEchappements = null; - if (is_null($codeEchappements) or $uniqid) { - if (is_null($uniqid)) { - $uniqid = uniqid(); - } + if ($codeEchappements === null || $uniqid) { + $uniqid ??= uniqid(); $uniqid = substr(md5($uniqid), 0, 4); $codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"]; } @@ -445,7 +442,7 @@ // si la query contient deja des codes d'echappement on va s'emmeler les pinceaux et donc on ne touche a rien // ce n'est pas un cas legitime foreach ($codeEchappements as $codeEchappement) { - if (strpos($query, (string) $codeEchappement) !== false) { + if (str_contains($query, (string) $codeEchappement)) { return [$query, []]; } } @@ -461,15 +458,13 @@ $part = array_shift($textes); $nextpos = strpos($query_echappees, $part, $currentpos); // si besoin recoller ensemble les doubles '' de sqlite (echappement des ') - while (count($textes) and substr($part, -1) === "'") { + while (count($textes) && str_ends_with($part, "'")) { $next = reset($textes); if ( - strpos($next, "'") === 0 - and strpos($query_echappees, $part . $next, $currentpos) === $nextpos + str_starts_with($next, "'") && strpos($query_echappees, $part . $next, $currentpos) === $nextpos ) { $part .= array_shift($textes); - } - else { + } else { break; } } @@ -510,8 +505,10 @@ * @param string $query * @param array $textes * @return string + * @deprecated */ function query_reinjecte_textes($query, $textes) { + trigger_deprecation('spip', '4.4', 'Using "%s" is deprecated, use "%s" instead', __FUNCTION__, 'Spip\Texte\Collecteur\QuotedStrings'); // recuperer les codes echappements $codeEchappements = query_echappe_textes(null); @@ -524,7 +521,6 @@ return $query; } - /** * Exécute une requête sur le serveur SQL * @@ -537,7 +533,7 @@ * @return bool|mixed * - false si on ne peut pas exécuter la requête * - indéfini sinon. - **/ + */ function spip_query($query, $serveur = '') { $f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true); diff -Nru spip-4.4.23+dfsg/ecrire/base/create.php spip-4.4.28+dfsg/ecrire/base/create.php --- spip-4.4.23+dfsg/ecrire/base/create.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/create.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,19 +1,17 @@ $type) { // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY" - if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["$key $type"])) { + if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) { sql_alter("TABLE $table ADD $key ($type)", $serveur); } $last = $field; @@ -122,7 +119,6 @@ * * @param array $tables_inc * tables avec autoincrement sur la cle primaire - * @param $tables_noinc * tables sans autoincrement sur la cle primaire * @param bool|array $up * upgrader (true) ou creer (false) @@ -130,7 +126,6 @@ * et des $tables_inc / $tables_noinc seront traitees * @param string $serveur * serveur sql - * @return void */ function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') { if ($up === false) { @@ -143,13 +138,13 @@ } } foreach ($tables_inc as $k => $v) { - if (!$old or in_array($k, $up)) { + if (!$old || in_array($k, $up)) { creer_ou_upgrader_table($k, $v, true, $old, $serveur); } } foreach ($tables_noinc as $k => $v) { - if (!$old or in_array($k, $up)) { + if (!$old || in_array($k, $up)) { creer_ou_upgrader_table($k, $v, false, $old, $serveur); } } @@ -168,7 +163,6 @@ * @uses alterer_base() * * @param string $serveur - * @return void */ function creer_base($serveur = '') { @@ -198,7 +192,6 @@ * * @param array $upgrade_tables * @param string $serveur - * @return void */ function maj_tables($upgrade_tables = [], $serveur = '') { alterer_base( diff -Nru spip-4.4.23+dfsg/ecrire/base/delete_all.php spip-4.4.28+dfsg/ecrire/base/delete_all.php --- spip-4.4.23+dfsg/ecrire/base/delete_all.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/delete_all.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $t) { // par defaut tout est coche sauf les tables dans $exclude - if (is_null($post)) { + if ($post === null) { $check = (in_array($t, $exclude) ? false : true); } // mais si on a poste une selection, la reprendre else { @@ -151,7 +149,6 @@ return $res; } - /** * Lister les tables non exportables par defaut * (liste completable par le pipeline lister_tables_noexport @@ -162,7 +159,7 @@ function lister_tables_noexport() { // par defaut tout est exporte sauf les tables ci-dessous static $EXPORT_tables_noexport = null; - if (!is_null($EXPORT_tables_noexport)) { + if ($EXPORT_tables_noexport !== null) { return $EXPORT_tables_noexport; } @@ -170,12 +167,12 @@ 'spip_caches', // plugin invalideur 'spip_resultats', // resultats de recherche ... c'est un cache ! 'spip_test', // c'est un test ! - #'spip_referers', - #'spip_referers_articles', - #'spip_visites', - #'spip_visites_articles', - #'spip_versions', - #'spip_versions_fragments' + # 'spip_referers', + # 'spip_referers_articles', + # 'spip_visites', + # 'spip_visites_articles', + # 'spip_versions', + # 'spip_versions_fragments' ]; $EXPORT_tables_noexport = pipeline('lister_tables_noexport', $EXPORT_tables_noexport); @@ -192,7 +189,7 @@ */ function lister_tables_noimport() { static $IMPORT_tables_noimport = null; - if (!is_null($IMPORT_tables_noimport)) { + if ($IMPORT_tables_noimport !== null) { return $IMPORT_tables_noimport; } @@ -212,7 +209,6 @@ return $IMPORT_tables_noimport; } - /** * Lister les tables a ne pas effacer * (liste completable par le pipeline lister_tables_noerase @@ -222,7 +218,7 @@ */ function lister_tables_noerase() { static $IMPORT_tables_noerase = null; - if (!is_null($IMPORT_tables_noerase)) { + if ($IMPORT_tables_noerase !== null) { return $IMPORT_tables_noerase; } @@ -233,14 +229,13 @@ 'spip_referers', 'spip_referers_articles', 'spip_visites', - 'spip_visites_articles' + 'spip_visites_articles', ]; $IMPORT_tables_noerase = pipeline('lister_tables_noerase', $IMPORT_tables_noerase); return $IMPORT_tables_noerase; } - /** * construction de la liste des tables pour le dump : * toutes les tables principales @@ -259,15 +254,14 @@ $tables_jointures = $GLOBALS['tables_jointures']; if ( - include_spip('base/objets') - and function_exists('lister_tables_objets_sql') + include_spip('base/objets') && function_exists('lister_tables_objets_sql') ) { $tables = lister_tables_objets_sql(); foreach ($tables as $t => $infos) { - if ($infos['principale'] and !isset($tables_principales[$t])) { + if ($infos['principale'] && !isset($tables_principales[$t])) { $tables_principales[$t] = true; } - if (!$infos['principale'] and !isset($tables_auxiliaires[$t])) { + if (!$infos['principale'] && !isset($tables_auxiliaires[$t])) { $tables_auxiliaires[$t] = true; } if (is_countable($infos['tables_jointures']) ? count($infos['tables_jointures']) : 0) { @@ -290,10 +284,10 @@ } if (isset($tables_auxiliaires[$nom]) || isset($tables_principales[$nom])) { foreach ($liste_relations as $link_table) { - if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/) { + if (isset($tables_auxiliaires[$link_table])/* ||isset($tables_principales[$link_table]) */) { $tables_for_link[$link_table][] = $nom; } else { - if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/) { + if (isset($tables_auxiliaires["spip_$link_table"])/* ||isset($tables_principales["spip_$link_table"]) */) { $tables_for_link["spip_$link_table"][] = $nom; } } @@ -326,7 +320,7 @@ # si une restauration est interrompue, # cela se verra mieux si il manque des objets # que des liens - array_unshift($tables_for_dump, $link_table); + array_unshift($tables_for_dump, $link_table); } } @@ -354,7 +348,7 @@ foreach ($tables as $table) { if (!in_array($table, $exclure_tables)) { // sur le serveur principal, il ne faut pas supprimer l'auteur loge ! - if (($table != 'spip_auteurs') or $serveur != '') { + if ($table != 'spip_auteurs' || $serveur != '') { // regarder si il y a au moins un champ impt='non' $desc = $trouver_table($table, $serveur); if (isset($desc['field']['impt'])) { @@ -370,8 +364,8 @@ // Bidouille pour garder l'acces admin actuel pendant toute la restauration if ( $serveur == '' - and in_array('spip_auteurs', $tables) - and !in_array('spip_auteurs', $exclure_tables) + && in_array('spip_auteurs', $tables) + && !in_array('spip_auteurs', $exclure_tables) ) { base_conserver_copieur(true, $serveur); sql_delete('spip_auteurs', 'id_auteur>0', $serveur); @@ -383,11 +377,10 @@ * * @param bool $move * @param string $serveur - * @return void */ function base_conserver_copieur($move = true, $serveur = '') { // s'asurer qu'on a pas deja fait la manip ! - if ($GLOBALS['visiteur_session']['id_auteur'] > 0 and sql_countsel('spip_auteurs', 'id_auteur>0')) { + if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) { spip_log( 'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE @@ -462,7 +455,7 @@ $upgrade = false; // si la table existe et qu'on est a l'init, la dropper if ($desc_dest = sql_showtable($table, true, $serveur_dest) and $init) { - if ($serveur_dest == '' and in_array($table, ['spip_meta', 'spip_auteurs'])) { + if ($serveur_dest == '' && in_array($table, ['spip_meta', 'spip_auteurs'])) { // ne pas dropper auteurs et meta sur le serveur principal // faire un simple upgrade a la place // pour ajouter les champs manquants @@ -566,8 +559,7 @@ } if ( - !lire_fichier($status_file, $status) - or !$status = unserialize($status) + !lire_fichier($status_file, $status) || !($status = unserialize($status)) ) { $status = []; } @@ -615,10 +607,10 @@ // si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin // sinon chercher la vraie table $desc_source = false; - if (strncmp($table, 'spip_', 5) == 0) { + if (str_starts_with($table, 'spip_')) { $desc_source = $trouver_table(preg_replace(',^spip_,', '', $table), $serveur_source, true); } - if (!$desc_source or !isset($desc_source['exist']) or !$desc_source['exist']) { + if (!$desc_source || !isset($desc_source['exist']) || !$desc_source['exist']) { $desc_source = $trouver_table($table, $serveur_source, false); } @@ -626,19 +618,17 @@ if ($desc_source) { // $status['tables_copiees'][$table] contient l'avancement // de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...) - if (!isset($status['tables_copiees'][$table])) { - $status['tables_copiees'][$table] = 0; - } + $status['tables_copiees'][$table] ??= 0; if ( is_numeric($status['tables_copiees'][$table]) - and $status['tables_copiees'][$table] >= 0 - and $desc_dest = $preparer_table_dest( + && $status['tables_copiees'][$table] >= 0 + && ($desc_dest = $preparer_table_dest( $table, $desc_tables_dest[$table] ?? $desc_source, $serveur_dest, $status['tables_copiees'][$table] == 0 - ) + )) ) { if ($callback_progression) { $callback_progression($status['tables_copiees'][$table], 0, $table); @@ -662,7 +652,7 @@ // (permet un envoi par lot vers la destination) if ($data_pool > 0) { $s = strlen(serialize($row)); - while ($s < $data_pool and $row = sql_fetch($res, $serveur_source)) { + while ($s < $data_pool && ($row = sql_fetch($res, $serveur_source))) { $s += strlen(serialize($row)); $rows[] = $row; } @@ -679,7 +669,7 @@ return true; } $status['tables_copiees'][$table] += count($rows); - if ($max_time and time() > $max_time) { + if ($max_time && time() > $max_time) { break; } } @@ -691,7 +681,7 @@ $callback_progression($status['tables_copiees'][$table], 0, $table); } ecrire_fichier($status_file, serialize($status)); - if ($max_time and time() > $max_time) { + if ($max_time && time() > $max_time) { return false; } // on a pas fini, mais le temps imparti est ecoule } @@ -713,7 +703,7 @@ $callback_progression( 0, $status['tables_copiees'][$table], - "$table" . ((is_numeric($status['tables_copiees'][$table]) and $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '') + "$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '') ); } } diff -Nru spip-4.4.23+dfsg/ecrire/base/objets.php spip-4.4.28+dfsg/ecrire/base/objets.php --- spip-4.4.23+dfsg/ecrire/base/objets.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/objets.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ [ 'id_rubrique', @@ -122,7 +118,7 @@ 'url_site', 'chapo', 'texte', - 'ps' + 'ps', ], 'field' => [ 'id_article' => 'bigint(21) NOT NULL', @@ -162,10 +158,10 @@ ], 'join' => [ 'id_article' => 'id_article', - 'id_rubrique' => 'id_rubrique' + 'id_rubrique' => 'id_rubrique', ], 'parent' => [ - ['type' => 'rubrique', 'champ' => 'id_rubrique'] + ['type' => 'rubrique', 'champ' => 'id_rubrique'], ], 'rechercher_champs' => [ 'surtitre' => 5, @@ -176,7 +172,7 @@ 'ps' => 1, 'nom_site' => 1, 'url_site' => 1, - 'descriptif' => 4 + 'descriptif' => 4, ], 'rechercher_jointures' => [ 'auteur' => ['nom' => 10], @@ -187,15 +183,15 @@ 'publie' => 'publie', 'previsu' => 'publie,prop,prepa/auteur', 'post_date' => 'date', - 'exception' => ['statut', 'tout'] - ] + 'exception' => ['statut', 'tout'], + ], ], 'statut_titres' => [ 'prepa' => 'info_article_redaction', 'prop' => 'info_article_propose', 'publie' => 'info_article_publie', 'refuse' => 'info_article_refuse', - 'poubelle' => 'info_article_supprime' + 'poubelle' => 'info_article_supprime', ], 'statut_textes_instituer' => [ 'prepa' => 'texte_statut_en_cours_redaction', @@ -208,7 +204,7 @@ 'aide_changer_statut' => 'artstatut', 'tables_jointures' => [ 'profondeur' => 'rubriques', - #'id_auteur' => 'auteurs_liens' // declaration generique plus bas + # 'id_auteur' => 'auteurs_liens' // declaration generique plus bas ], ], 'spip_auteurs' => [ @@ -261,7 +257,7 @@ ], 'join' => [ 'id_auteur' => 'id_auteur', - 'login' => 'login' + 'login' => 'login', ], 'rechercher_champs' => [ 'nom' => 5, @@ -269,7 +265,7 @@ 'email' => 1, 'nom_site' => 1, 'url_site' => 1, - 'login' => 1 + 'login' => 1, ], // 2 conditions pour les auteurs : statut!=poubelle, // et avoir des articles publies @@ -278,21 +274,21 @@ 'champ' => 'statut', 'publie' => '!5poubelle', 'previsu' => '!5poubelle', - 'exception' => 'statut' + 'exception' => 'statut', ], [ 'champ' => [ ['spip_auteurs_liens', 'id_auteur'], [ 'spip_articles', - ['id_objet', 'id_article', 'objet', 'article'] + ['id_objet', 'id_article', 'objet', 'article'], ], - 'statut' + 'statut', ], 'publie' => 'publie', 'previsu' => '!', 'post_date' => 'date', - 'exception' => ['statut', 'lien', 'tout'] + 'exception' => ['statut', 'lien', 'tout'], ], ], 'statut_images' => [ @@ -301,7 +297,7 @@ '1comite' => 'auteur-1comite-16.png', '6forum' => 'auteur-6forum-16.png', '5poubelle' => 'auteur-5poubelle-16.png', - 'nouveau' => '' + 'nouveau' => '', ], 'statut_titres' => [ 'titre_image_visiteur', @@ -310,7 +306,7 @@ '6forum' => 'titre_image_visiteur', '5poubelle' => 'titre_image_auteur_supprime', ], - 'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas + 'tables_jointures' => [# 'auteurs_liens' // declaration generique plus bas ], ], 'spip_rubriques' => [ @@ -350,7 +346,7 @@ 'langue_choisie' => "VARCHAR(3) DEFAULT 'non'", 'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL", 'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - 'profondeur' => "smallint(5) DEFAULT '0' NOT NULL" + 'profondeur' => "smallint(5) DEFAULT '0' NOT NULL", ], 'key' => [ 'PRIMARY KEY' => 'id_rubrique', @@ -358,26 +354,26 @@ 'KEY id_parent' => 'id_parent', ], 'parent' => [ - ['type' => 'rubrique', 'champ' => 'id_parent'] + ['type' => 'rubrique', 'champ' => 'id_parent'], ], 'rechercher_champs' => [ 'titre' => 8, 'descriptif' => 5, - 'texte' => 1 + 'texte' => 1, ], 'statut' => [ [ 'champ' => 'statut', 'publie' => 'publie', 'previsu' => '!', - 'exception' => ['statut', 'tout'] + 'exception' => ['statut', 'tout'], ], ], - 'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas + 'tables_jointures' => [# 'id_auteur' => 'auteurs_liens' // declaration generique plus bas ], ], // toutes les tables ont le droit a une jointure sur les auteurs - ['tables_jointures' => ['id_auteur' => 'auteurs_liens']] + ['tables_jointures' => ['id_auteur' => 'auteurs_liens']], ]; // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install @@ -409,12 +405,12 @@ $add = $all[$i]; // eviter les doublons de declaration de table jointure (ex des mots sur auteurs) // pour les declarations generiques avec cles numeriques - if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) { + if ($i == 'tables_jointures' && isset($infos_tables[$t][$i]) && (is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0)) { $doublons = array_intersect($infos_tables[$t][$i], $add); foreach ($doublons as $d) { if ( is_numeric(array_search($d, $infos_tables[$t][$i])) - and is_numeric($k = array_search($d, $add)) + && is_numeric($k = array_search($d, $add)) ) { unset($add[$k]); } @@ -440,7 +436,7 @@ $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []); // l'ajouter au tableau $GLOBALS[$principale_ou_auxiliaire][$table] = []; - if (isset($infos['field']) and isset($infos['key'])) { + if (isset($infos['field']) && isset($infos['key'])) { foreach (['field', 'key', 'join'] as $k) { if (isset($infos_tables[$table][$k])) { $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k]; @@ -480,8 +476,8 @@ if ($table_sql === '::md5') { return $md5; } - if ($table_sql and !isset($infos_tables[$table_sql])) { - #$desc = renseigner_table_objet_sql($table_sql,$desc); + if ($table_sql && !isset($infos_tables[$table_sql])) { + # $desc = renseigner_table_objet_sql($table_sql,$desc); $desc = renseigner_table_objet_interfaces($table_sql, $desc); return $desc; @@ -493,7 +489,6 @@ return $infos_tables; } - /** * Déclare les tables principales du Core * @@ -501,14 +496,13 @@ * * @param array $tables_principales * Description des tables principales déjà déclarées - * @return void - **/ + */ function base_serial(&$tables_principales) { $spip_jobs = [ 'id_job' => 'bigint(21) NOT NULL', 'descriptif' => "text DEFAULT '' NOT NULL", - 'fonction' => 'varchar(255) NOT NULL', //nom de la fonction + 'fonction' => 'varchar(255) NOT NULL', // nom de la fonction 'args' => "longblob DEFAULT '' NOT NULL", // arguments 'md5args' => "char(32) NOT NULL default ''", // signature des arguments 'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction @@ -524,19 +518,17 @@ 'KEY status' => 'status', ]; - /// Attention: mes_fonctions peut avoir deja defini cette variable - /// il faut donc rajouter, mais pas reinitialiser + // / Attention: mes_fonctions peut avoir deja defini cette variable + // / il faut donc rajouter, mais pas reinitialiser $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key]; } - /** * Déclare les tables auxiliaires du Core * * @param array $tables_auxiliaires * Description des tables auxiliaires déjà déclarées - * @return void - **/ + */ function base_auxiliaires(&$tables_auxiliaires) { $spip_resultats = [ 'recherche' => "char(16) DEFAULT '' NOT NULL", @@ -544,7 +536,7 @@ 'points' => "INT UNSIGNED DEFAULT '0' NOT NULL", 'table_objet' => "varchar(30) DEFAULT '' NOT NULL", 'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal) - 'maj' => 'TIMESTAMP' + 'maj' => 'TIMESTAMP', ]; $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ... @@ -554,7 +546,7 @@ 'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL", 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", - 'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL" + 'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL", ]; $spip_auteurs_liens_key = [ @@ -568,11 +560,11 @@ 'nom' => 'VARCHAR (255) NOT NULL', 'valeur' => "text DEFAULT ''", 'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL", - 'maj' => 'TIMESTAMP' + 'maj' => 'TIMESTAMP', ]; $spip_meta_key = [ - 'PRIMARY KEY' => 'nom' + 'PRIMARY KEY' => 'nom', ]; $spip_jobs_liens = [ @@ -583,29 +575,28 @@ $spip_jobs_liens_key = [ 'PRIMARY KEY' => 'id_job,id_objet,objet', - 'KEY id_job' => 'id_job' + 'KEY id_job' => 'id_job', ]; $tables_auxiliaires['spip_auteurs_liens'] = [ 'field' => &$spip_auteurs_liens, - 'key' => &$spip_auteurs_liens_key + 'key' => &$spip_auteurs_liens_key, ]; $tables_auxiliaires['spip_meta'] = [ 'field' => &$spip_meta, - 'key' => &$spip_meta_key + 'key' => &$spip_meta_key, ]; $tables_auxiliaires['spip_resultats'] = [ 'field' => &$spip_resultats, - 'key' => &$spip_resultats_key + 'key' => &$spip_resultats_key, ]; $tables_auxiliaires['spip_jobs_liens'] = [ 'field' => &$spip_jobs_liens, - 'key' => &$spip_jobs_liens_key + 'key' => &$spip_jobs_liens_key, ]; } - /** * Auto remplissage des informations non explicites * sur un objet d'une table sql @@ -671,118 +662,58 @@ $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql); } } - if (!isset($infos['type_surnoms'])) { - $infos['type_surnoms'] = []; - } + $infos['type_surnoms'] ??= []; - if (!isset($infos['table_objet_sql'])) { - $infos['table_objet_sql'] = $table_sql; - } - if (!isset($infos['table_objet'])) { - $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql); - } - if (!isset($infos['table_objet_surnoms'])) { - $infos['table_objet_surnoms'] = []; - } + $infos['table_objet_sql'] ??= $table_sql; + $infos['table_objet'] ??= preg_replace(',^spip_,', '', $table_sql); + $infos['table_objet_surnoms'] ??= []; - if (!isset($infos['principale'])) { - $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false); - } + $infos['principale'] ??= isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false; // normaliser pour pouvoir tester en php $infos['principale']? // et dans une boucle {principale=oui} - $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false); + $infos['principale'] = (($infos['principale'] && $infos['principale'] != 'non') ? 'oui' : false); // declarer et normaliser pour pouvoir tester en php $infos['editable']? // et dans une boucle {editable=oui} - if (!isset($infos['editable'])) { - $infos['editable'] = 'oui'; - } + $infos['editable'] ??= 'oui'; - $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false); + $infos['editable'] = (($infos['editable'] && $infos['editable'] != 'non') ? 'oui' : false); // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres // seules les exceptions sont donc a declarer - if (!isset($infos['page'])) { - $infos['page'] = ($infos['principale'] ? $infos['type'] : ''); - } + $infos['page'] ??= $infos['principale'] ? $infos['type'] : ''; - if (!isset($infos['url_voir'])) { - $infos['url_voir'] = $infos['type']; - } - if (!isset($infos['url_edit'])) { - $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : ''); - } - if (!isset($infos['icone_objet'])) { - $infos['icone_objet'] = $infos['type']; - } + $infos['url_voir'] ??= $infos['type']; + $infos['url_edit'] ??= $infos['url_voir'] . ($infos['editable'] ? '_edit' : ''); + $infos['icone_objet'] ??= $infos['type']; // chaines de langue // par defaut : objet:icone_xxx_objet - if (!isset($infos['texte_retour'])) { - $infos['texte_retour'] = 'icone_retour'; - } - if (!isset($infos['texte_modifier'])) { - $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type']; - } - if (!isset($infos['texte_creer'])) { - $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type']; - } - if (!isset($infos['texte_creer_associer'])) { - $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type']; - } - if (!isset($infos['texte_ajouter'])) { - // Ajouter un X - $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type']; - } - if (!isset($infos['texte_objets'])) { - $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet']; - } - if (!isset($infos['texte_objet'])) { - $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type']; - } - if (!isset($infos['texte_logo_objet'])) { - // objet:titre_logo_objet "Logo de ce X" - $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type']; - } - if (!isset($infos['texte_langue_objet'])) { - // objet:texte_langue_objet "Langue de ce X" - $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type']; - } - if (!isset($infos['texte_definir_comme_traduction_objet'])) { - // "Ce X est une traduction du X numéro :" - $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type']; - } + $infos['texte_retour'] ??= 'icone_retour'; + $infos['texte_modifier'] ??= $infos['type'] . ':icone_modifier_' . $infos['type']; + $infos['texte_creer'] ??= $infos['type'] . ':icone_creer_' . $infos['type']; + $infos['texte_creer_associer'] ??= $infos['type'] . ':texte_creer_associer_' . $infos['type']; + $infos['texte_ajouter'] ??= $infos['type'] . ':texte_ajouter_' . $infos['type']; + $infos['texte_objets'] ??= $infos['type'] . ':titre_' . $infos['table_objet']; + $infos['texte_objet'] ??= $infos['type'] . ':titre_' . $infos['type']; + $infos['texte_logo_objet'] ??= $infos['type'] . ':titre_logo_' . $infos['type']; + $infos['texte_langue_objet'] ??= $infos['type'] . ':titre_langue_' . $infos['type']; + $infos['texte_definir_comme_traduction_objet'] ??= $infos['type'] . ':texte_definir_comme_traduction_' . $infos['type']; // objet:info_aucun_objet - if (!isset($infos['info_aucun_objet'])) { - $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type']; - } + $infos['info_aucun_objet'] ??= $infos['type'] . ':info_aucun_' . $infos['type']; // objet:info_1_objet - if (!isset($infos['info_1_objet'])) { - $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type']; - } + $infos['info_1_objet'] ??= $infos['type'] . ':info_1_' . $infos['type']; // objet:info_nb_objets - if (!isset($infos['info_nb_objets'])) { - $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet']; - } + $infos['info_nb_objets'] ??= $infos['type'] . ':info_nb_' . $infos['table_objet']; - if (!isset($infos['champs_editables'])) { - $infos['champs_editables'] = []; - } - if (!isset($infos['champs_versionnes'])) { - $infos['champs_versionnes'] = []; - } - if (!isset($infos['rechercher_champs'])) { - $infos['rechercher_champs'] = []; - } - if (!isset($infos['rechercher_jointures'])) { - $infos['rechercher_jointures'] = []; - } + $infos['champs_editables'] ??= []; + $infos['champs_versionnes'] ??= []; + $infos['rechercher_champs'] ??= []; + $infos['rechercher_jointures'] ??= []; - if (!isset($infos['modeles'])) { - $infos['modeles'] = [$infos['type']]; - } + $infos['modeles'] ??= [$infos['type']]; return $infos; } @@ -796,13 +727,11 @@ * statut * tables_jointures * - * @param $table_sql - * @param $infos * @return array */ function renseigner_table_objet_interfaces($table_sql, &$infos) { if (!isset($infos['titre'])) { - if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) { + if (isset($infos['table_objet']) && isset($GLOBALS['table_titre'][$infos['table_objet']])) { $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']]; } else { $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,"); @@ -810,7 +739,7 @@ } } if (!isset($infos['date'])) { - if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) { + if (isset($infos['table_objet']) && isset($GLOBALS['table_date'][$infos['table_objet']])) { $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']]; } else { $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : ''); @@ -833,10 +762,10 @@ * @api * @return array * Liste et descriptions des tables principales - **/ + */ function lister_tables_principales() { static $done = false; - if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) { + if (!$done || !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) { lister_tables_objets_sql(); $done = true; } @@ -850,10 +779,10 @@ * @api * @return array * Liste et descriptions des tables auxiliaires - **/ + */ function lister_tables_auxiliaires() { static $done = false; - if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) { + if (!$done || !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) { lister_tables_objets_sql(); $done = true; } @@ -871,7 +800,7 @@ static $md5 = null; if ( !$surnoms - or $md5 != lister_tables_objets_sql('::md5') + || $md5 != lister_tables_objets_sql('::md5') ) { // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions // pour compatibilite, car il faut dorenavent utiliser @@ -892,10 +821,10 @@ // et preg_replace(',^spip_|^id_|s$,',table)=>table if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide // optimisations pour table_objet - //$surnoms[$infos['type']] = $infos['table_objet']; + // $surnoms[$infos['type']] = $infos['table_objet']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet']; - if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) { + if (is_array($infos['table_objet_surnoms']) && count($infos['table_objet_surnoms'])) { foreach ($infos['table_objet_surnoms'] as $surnom) { $surnoms[$surnom] = $infos['table_objet']; } @@ -918,7 +847,7 @@ static $md5 = null; if ( !$surnoms - or $md5 != lister_tables_objets_sql('::md5') + || $md5 != lister_tables_objets_sql('::md5') ) { // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions // pour compatibilite, car il faut dorenavent utiliser @@ -928,11 +857,11 @@ foreach ($infos_tables as $t => $infos) { if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide // optimisations pour objet_type - //$surnoms[$infos['type']] = $infos['type']; + // $surnoms[$infos['type']] = $infos['type']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type']; // surnoms declares - if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) { + if (is_array($infos['type_surnoms']) && count($infos['type_surnoms'])) { foreach ($infos['type_surnoms'] as $surnom) { $surnoms[$surnom] = $infos['type']; } @@ -954,7 +883,7 @@ * Nom du fichier de connexion à la base de données * @return array * Couples (nom de la table SQL => même nom, sans 'spip_' devant) - **/ + */ function lister_tables_spip($serveur = '') { static $tables = []; if (!isset($tables[$serveur])) { @@ -974,7 +903,6 @@ return $tables[$serveur]; } - /** * Retourne la liste des tables SQL, Spip ou autres * @@ -984,7 +912,7 @@ * Nom du fichier de connexion à la base de données * @return array * Couples (nom de la table SQL => même nom) - **/ + */ function lister_toutes_tables($serveur) { static $tables = []; if (!isset($tables[$serveur])) { @@ -1016,7 +944,7 @@ * - false: Pas de recherche en bdd * @return string * Nom de l'objet - **/ + */ function table_objet(string $type, $serveur = ''): string { if ($type) { @@ -1037,19 +965,20 @@ $trouver_table = charger_fonction('trouver_table', 'base'); $typetrim = rtrim($type, 's') . 's'; if ( - (isset($t[$typetrim]) or in_array($typetrim, $t)) - and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur)) + (isset($t[$typetrim]) || in_array($typetrim, $t)) + && ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur)) ) { return $desc['id_table']; - } elseif ( - (isset($t[$type]) or in_array($type, $t)) - and ($desc = $trouver_table($type, $serveur)) + } + if ( + (isset($t[$type]) || in_array($type, $t)) + && ($desc = $trouver_table($type, $serveur)) ) { return $desc['id_table']; } spip_log('table_objet(' . $type . ') calculee sans verification'); - #spip_log(debug_backtrace(),'db'); + # spip_log(debug_backtrace(),'db'); } return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false @@ -1071,7 +1000,7 @@ * - false: Pas de recherche en bdd * @return string * Nom de la table SQL - **/ + */ function table_objet_sql(string $type, $serveur = ''): string { $nom = table_objet($type, $serveur); if (!strlen($nom)) { @@ -1091,7 +1020,7 @@ } elseif ($serveur !== false) { $serveur = (string) $serveur; $t = lister_tables_spip($serveur); - if (isset($t[$nom]) or in_array($nom, $t)) { + if (isset($t[$nom]) || in_array($nom, $t)) { $trouver_table = charger_fonction('trouver_table', 'base'); if ($desc = $trouver_table($nom, $serveur)) { return $desc['table_sql']; @@ -1117,7 +1046,7 @@ * Nom du connecteur * @return string|null * Nom de la clé primaire - **/ + */ function id_table_objet(string $type, string $serveur = ''): ?string { static $trouver_table = null; $type = objet_type($type, $serveur); @@ -1131,14 +1060,13 @@ $ts = lister_tables_spip($serveur); if ( - in_array($t, $ts) - or in_array($t, lister_toutes_tables($serveur)) + in_array($t, $ts) || in_array($t, lister_toutes_tables($serveur)) ) { $desc = $trouver_table($t, $serveur); if (isset($desc['key']['PRIMARY KEY'])) { return $desc['key']['PRIMARY KEY']; } - if (!$desc or isset($desc['field']["id_$type"])) { + if (!$desc || isset($desc['field']["id_$type"])) { return "id_$type"; } // sinon renvoyer le premier champ de la table... @@ -1165,7 +1093,7 @@ * - false: Pas de recherche en bdd * @return string|null * Type de l'objet - **/ + */ function objet_type(string $table_objet, $serveur = ''): ?string { if (!$table_objet) { return null; @@ -1188,8 +1116,8 @@ // oui si table_objet ressemblait deja a un type if ( $type == $table_objet - or (table_objet($type, $serveur) == $table_objet) - or (table_objet_sql($type, $serveur) == $table_objet) + || table_objet($type, $serveur) == $table_objet + || table_objet_sql($type, $serveur) == $table_objet ) { return $type; } @@ -1212,11 +1140,11 @@ if (in_array($table_objet, $ts)) { $desc = $trouver_table($table_objet); } - if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) { + if (!$desc && in_array($table_objet = table_objet($type, $serveur), $ts)) { $desc = $trouver_table($table_objet, $serveur); } // si le type est declare : bingo ! - if ($desc and isset($desc['type'])) { + if ($desc && isset($desc['type'])) { return $desc['type']; } @@ -1248,9 +1176,9 @@ $id_table_objet = id_table_objet($objet, $serveur); $trouver_table = charger_fonction('trouver_table', 'base'); if ( - $desc = $trouver_table($table_objet, $serveur) - and isset($desc['statut']) - and $desc['statut'] + ($desc = $trouver_table($table_objet, $serveur)) + && isset($desc['statut']) + && $desc['statut'] ) { $boucle = new Boucle(); $boucle->show = $desc; @@ -1295,7 +1223,6 @@ return true; } - /** * Cherche les contenus parent d'un contenu précis. * @@ -1369,7 +1296,7 @@ if (isset($parent_methode['condition'])) { $where = [ "$cle_objet = $id_objet", - $parent_methode['condition'] + $parent_methode['condition'], ]; if (!sql_countsel($table_objet, $where)) { $condition_objet_invalide = true; @@ -1398,29 +1325,28 @@ } // On lance la requête de récupération du parent - $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens'); + $is_table_lien = (str_contains($table, '_liens') && str_ends_with($table, '_liens')); if ( !$condition_objet_invalide - and $where - and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where)) + && $where + && ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where)) ) { foreach ($lignes as $ligne) { // Si le type est fixe if (isset($parent_methode['type'])) { $parent = [ - 'objet' => $parent_methode['type'], - 'id_objet' => intval($ligne[$parent_methode['champ']]), - 'champ' => $parent_methode['champ'], - 'table' => $table, + 'objet' => $parent_methode['type'], + 'id_objet' => intval($ligne[$parent_methode['champ']]), + 'champ' => $parent_methode['champ'], + 'table' => $table, ]; - } - elseif (isset($parent_methode['champ_type'])) { + } elseif (isset($parent_methode['champ_type'])) { $parent = [ - 'objet' => $ligne[$parent_methode['champ_type']], - 'id_objet' => intval($ligne[$parent_methode['champ']]), - 'champ' => $parent_methode['champ'], + 'objet' => $ligne[$parent_methode['champ_type']], + 'id_objet' => intval($ligne[$parent_methode['champ']]), + 'champ' => $parent_methode['champ'], 'champ_type' => $parent_methode['champ_type'], - 'table' => $table, + 'table' => $table, ]; } if ($is_table_lien) { @@ -1451,8 +1377,6 @@ * Fonction helper qui permet de récupérer une liste simplifiée des parents, regroupés par objet * [ 'objet1' => [ids...], 'objet2' => [ids...] ] * - * @param $objet - * @param $id_objet * @return array */ function objet_lister_parents_par_type($objet, $id_objet) { @@ -1460,16 +1384,13 @@ $parents_par_type = []; foreach ($parents as $parent) { - if (!isset($parents_par_type[$parent['objet']])) { - $parents_par_type[$parent['objet']] = []; - } + $parents_par_type[$parent['objet']] ??= []; $parents_par_type[$parent['objet']][] = $parent['id_objet']; } return $parents_par_type; } - /** * Cherche tous les contenus enfants d'un contenu précis * @@ -1491,9 +1412,7 @@ * le tableau contient en plus en entrée 'lien' qui contient les informations complètes du lien (rang, role...) * * @api - * @param $objet * Type de l'objet dont on cherche les enfants - * @param $id_objet * Identifiant de l'objet dont on cherche les enfants * @return array * Retourne un tableau de tableaux, avec comme clés les types des objets, et dans chacun un tableau des identifiants trouvés @@ -1541,12 +1460,12 @@ } // On lance la requête - $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens'); + $is_table_lien = (str_contains($table_enfant, '_liens') && str_ends_with($table_enfant, '_liens')); if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) { $enfant = [ 'objet' => $objet_enfant, 'id_objet' => 0, - 'table' => $table_enfant + 'table' => $table_enfant, ]; if (isset($_methode_parent['champ'])) { $enfant['champ'] = $_methode_parent['champ']; @@ -1584,8 +1503,6 @@ * Fonction helper qui permet de récupérer une liste simplifiée des enfants, regroupés par objet * [ 'objet1' => [ids...], 'objet2' => [ids...] ] * - * @param $objet - * @param $id_objet * @return array */ function objet_lister_enfants_par_type($objet, $id_objet) { @@ -1593,9 +1510,7 @@ $enfants_par_type = []; foreach ($enfants as $enfant) { - if (!isset($enfants_par_type[$enfant['objet']])) { - $enfants_par_type[$enfant['objet']] = []; - } + $enfants_par_type[$enfant['objet']] ??= []; $enfants_par_type[$enfant['objet']][] = $enfant['id_objet']; } @@ -1605,7 +1520,6 @@ /** * Donne les informations de parenté directe d'un type d'objet si on en trouve * - * @param $objet * Type de l'objet dont on cherche les informations de parent * @return array|false * Retourne un tableau de tableau contenant les informations de type et de champ pour trouver le parent ou false sinon @@ -1620,7 +1534,7 @@ // Si on trouve bien la description de cet objet if ($infos = lister_tables_objets_sql($table)) { - if (isset($infos['parent']) and is_array($infos['parent'])) { + if (isset($infos['parent']) && is_array($infos['parent'])) { // S'il y a une description explicite de parent, c'est prioritaire // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau // de description @@ -1645,7 +1559,6 @@ /** * Donne les informations des enfants directs d'un type d'objet si on en trouve * - * @param $objet * Type de l'objet dont on cherche les informations des enfants * @return array * Retourne un tableau de tableaux contenant chacun les informations d'un type d'enfant @@ -1667,13 +1580,13 @@ // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé foreach ($parent_methodes as $parent_methode) { // Si la méthode qu'on teste n'exclut pas le parent demandé - if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) { + if (!isset($parent_methode['exclus']) || !in_array($objet, $parent_methode['exclus'])) { // Si le type du parent est fixe et directement l'objet demandé - if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) { + if (isset($parent_methode['type']) && isset($parent_methode['champ']) && $parent_methode['type'] == $objet) { $enfants[$objet][$objet_enfant] = $parent_methode; } // Si le type est variable, alors l'objet demandé peut forcément être parent - elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) { + elseif (isset($parent_methode['champ_type']) && isset($parent_methode['champ'])) { $enfants[$objet][$objet_enfant] = $parent_methode; } } diff -Nru spip-4.4.23+dfsg/ecrire/base/repair.php spip-4.4.28+dfsg/ecrire/base/repair.php --- spip-4.4.23+dfsg/ecrire/base/repair.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/repair.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ ' . spip_htmlentities($msg) . "\n"; diff -Nru spip-4.4.23+dfsg/ecrire/base/serial.php spip-4.4.28+dfsg/ecrire/base/serial.php --- spip-4.4.23+dfsg/ecrire/base/serial.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/serial.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,13 +1,13 @@ true, ]; @@ -118,7 +114,7 @@ // base sous SPIP: gerer les abreviations explicites des noms de table if ($connexion['spip_connect_version']) { - if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) { + if ($table_spip && isset($GLOBALS['table_des_tables'][$nom])) { $nom = $GLOBALS['table_des_tables'][$nom]; $nom_sql = 'spip_' . $nom; } @@ -130,29 +126,30 @@ // dans le fichier cache if ( !isset($connexion['tables'][$nom_sql]) - and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul' - and (!isset($connexion['tables']) or !$connexion['tables']) + && defined('_VAR_MODE') + && _VAR_MODE !== 'recalcul' + && (!isset($connexion['tables']) || !$connexion['tables']) ) { if ( lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache) - and $desc_cache = unserialize($desc_cache) + && ($desc_cache = unserialize($desc_cache)) ) { $connexion['tables'] = $desc_cache; } } - if ($table_spip and !isset($connexion['tables'][$nom_sql])) { + if ($table_spip && !isset($connexion['tables'][$nom_sql])) { if (isset($GLOBALS['tables_principales'][$nom_sql])) { $fdesc = $GLOBALS['tables_principales'][$nom_sql]; } // meme si pas d'abreviation declaree, trouver la table spip_$nom // si c'est une table principale, // puisqu'on le fait aussi pour les tables auxiliaires - elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) { + elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) { $nom_sql = 'spip_' . $nom; $fdesc = &$GLOBALS['tables_principales'][$nom_sql]; } elseif ( isset($GLOBALS['tables_auxiliaires'][$n = $nom]) - or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) + || isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) ) { $nom_sql = $n; $fdesc = &$GLOBALS['tables_auxiliaires'][$n]; @@ -163,8 +160,8 @@ $exists = sql_table_exists($nom_sql, $table_spip, $serveur); if ( !$exists - or !$desc = sql_showtable($nom_sql, $table_spip, $serveur) - or !$desc['field'] + || !($desc = sql_showtable($nom_sql, $table_spip, $serveur)) + || !$desc['field'] ) { if (!$fdesc) { $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG; @@ -197,9 +194,7 @@ if (!isset($desc['key']) && !empty($fdesc['key'])) { $desc['key'] = $fdesc['key']; } - if (! isset($desc['key'])) { - $desc['key'] = []; - } + $desc['key'] ??= []; // si tables_objets_sql est bien fini d'init, on peut cacher $connexion['tables'][$nom_sql] = $desc; diff -Nru spip-4.4.23+dfsg/ecrire/base/upgrade.php spip-4.4.28+dfsg/ecrire/base/upgrade.php --- spip-4.4.23+dfsg/ecrire/base/upgrade.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/base/upgrade.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ 'version_installee', 'valeur' => $GLOBALS['spip_version_base'], - 'impt' => 'non' + 'impt' => 'non', ] ); } @@ -211,7 +207,6 @@ * ``` * @param string $table_meta * Nom de la table meta (sans le prefixe spip_) dans laquelle trouver la meta $nom_meta_base_version - * @return void */ function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') { @@ -275,7 +270,6 @@ * @param string $meta * @param string $table * @param string $redirect - * @return void */ function relance_maj($meta, $table, $redirect = '') { include_spip('inc/headers'); @@ -298,7 +292,6 @@ * @param string $installee * @param string $meta * @param string $table - * @return void */ function maj_debut_page($installee, $meta, $table) { static $done = false; @@ -329,7 +322,6 @@ $done = true; } - /** * Gestion des mises à jour de SPIP et des plugins * @@ -393,9 +385,7 @@ foreach ($maj as $v => $operations) { // si une maj pour cette version if ( - $v == 'init' or - (spip_version_compare($v, $installee, '>') - and spip_version_compare($v, $cible, '<=')) + $v == 'init' || spip_version_compare($v, $installee, '>') && spip_version_compare($v, $cible, '<=') ) { if ($debut_page) { maj_debut_page($v, $meta, $table); @@ -413,7 +403,7 @@ if ($meta) { ecrire_meta($meta, $installee = $v, 'oui', $table); } - echo (_IS_CLI ? "\n" : '
    '); + echo _IS_CLI ? "\n" : '
    '; } if (time() >= _TIME_OUT) { relance_maj($meta, $table, $redirect); @@ -459,8 +449,7 @@ if ($i >= $etape) { $msg = "maj $table $meta2 etape $i"; if ( - is_array($r) - and function_exists($f = array_shift($r)) + is_array($r) && function_exists($f = array_shift($r)) ) { // note: $r (arguments de la fonction $f) peut avoir des données tabulaires spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE); @@ -470,10 +459,10 @@ // mais pour les fonctions complexes, // il faut les rejouer jusqu'a achevement. // C'est a elle d'assurer qu'elles progressent a chaque rappel - if (strncmp($f, 'sql_', 4) == 0) { + if (str_starts_with($f, 'sql_')) { ecrire_meta($meta2, $i + 1, 'non', $table); } - echo (_IS_CLI ? '.' : " ."); + echo _IS_CLI ? '.' : " ."; $f(...$r); // si temps imparti depasse, on relance sans ecrire en meta // car on est peut etre sorti sur timeout si c'est une fonction longue @@ -503,7 +492,7 @@ * Vérifie qu'il est possible d'ajouter une colonne à une table SQL * * @return bool True si possible. - **/ + */ function upgrade_test() { sql_drop_table('spip_test', true); sql_create('spip_test', ['a' => 'int']); diff -Nru spip-4.4.23+dfsg/ecrire/charsets/cp1250.php spip-4.4.28+dfsg/ecrire/charsets/cp1250.php --- spip-4.4.23+dfsg/ecrire/charsets/cp1250.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/cp1250.php 2026-10-07 13:48:22.000000000 +0000 @@ -4,11 +4,8 @@ * Déclaration des correspondances entre charsets cp1250 (europe centrale et de l'est) et unicode * * @author Mathieu Lutfy - * @link http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT - * - * @package SPIP\Core\Charsets - **/ - + * @see http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT + */ $GLOBALS['CHARSET']['cp1250'] = [ 0x80 => 0x20AC, 0x82 => 0x201A, @@ -132,5 +129,5 @@ 0xFC => 0x00FC, 0xFD => 0x00FD, 0xFE => 0x0163, - 0xFF => 0x02D9 + 0xFF => 0x02D9, ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/cp1251.php spip-4.4.28+dfsg/ecrire/charsets/cp1251.php --- spip-4.4.23+dfsg/ecrire/charsets/cp1251.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/cp1251.php 2026-10-07 13:48:22.000000000 +0000 @@ -3,11 +3,8 @@ /** * Déclaration des correspondances entre charsets cp1251 (cyrillic) et unicode * - * @link http://czyborra.com/charsets/cyrillic.html - * - * @package SPIP\Core\Charsets - **/ - + * @see http://czyborra.com/charsets/cyrillic.html + */ $GLOBALS['CHARSET']['cp1251'] = [ 0x80 => 0x0402, 0x81 => 0x0403, @@ -135,5 +132,5 @@ 0xFC => 0x044C, 0xFD => 0x044D, 0xFE => 0x044E, - 0xFF => 0x044F + 0xFF => 0x044F, ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/cp1256.php spip-4.4.28+dfsg/ecrire/charsets/cp1256.php --- spip-4.4.23+dfsg/ecrire/charsets/cp1256.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/cp1256.php 2026-10-07 13:48:22.000000000 +0000 @@ -4,11 +4,8 @@ * Déclaration des correspondances entre charsets cp1256 (arabic) et unicode * * @author george kandalaft - * @link http://www.microsoft.com/typography/unicode/1256.htm - * - * @package SPIP\Core\Charsets - **/ - + * @see http://www.microsoft.com/typography/unicode/1256.htm + */ $GLOBALS['CHARSET']['cp1256'] = [ 0x80 => 0x20AC, 0x81 => 0x067E, @@ -137,5 +134,5 @@ 0xFC => 0x00FC, 0xFD => 0x200E, 0xFE => 0x200F, - 0xFF => 0x06D2 + 0xFF => 0x06D2, ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/html.php spip-4.4.28+dfsg/ecrire/charsets/html.php --- spip-4.4.23+dfsg/ecrire/charsets/html.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/html.php 2026-10-07 13:48:22.000000000 +0000 @@ -3,10 +3,7 @@ /** * Déclaration des entités HTML (à completer éventuellement) et leur correspondances * en écriture unicode - * - * @package SPIP\Core\Charsets - **/ - + */ $GLOBALS['CHARSET']['html'] = [ 'ldquo' => '“', 'rdquo' => '”', @@ -121,10 +118,8 @@ 'euro' => '€', 'OElig' => 'Œ', 'oelig' => 'œ', - 'iexcl' => '¡' - + 'iexcl' => '¡', ]; -## caracteres tres speciaux a ne pas convertir -#'amp' => '&', 'quot' => '"', 'lt' => '<', 'gt' => '>', -; +# # caracteres tres speciaux a ne pas convertir +# 'amp' => '&', 'quot' => '"', 'lt' => '<', 'gt' => '>', diff -Nru spip-4.4.23+dfsg/ecrire/charsets/iso-8859-1.php spip-4.4.28+dfsg/ecrire/charsets/iso-8859-1.php --- spip-4.4.23+dfsg/ecrire/charsets/iso-8859-1.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/iso-8859-1.php 2026-10-07 13:48:22.000000000 +0000 @@ -2,15 +2,11 @@ /** * Déclaration des correspondances entre charsets iso-8859-1 et unicode - * - * @package SPIP\Core\Charsets - **/ - + */ $GLOBALS['CHARSET']['iso-8859-1'] = [ - -// plage invalide en iso-8859-1 mais souvent utilisee quand meme (windows) -// cf. http://openweb.eu.org/articles/caracteres_illegaux/ -// voir aussi copie de ces valeurs dans inc/charsets.php + // plage invalide en iso-8859-1 mais souvent utilisee quand meme (windows) + // cf. http://openweb.eu.org/articles/caracteres_illegaux/ + // voir aussi copie de ces valeurs dans inc/charsets.php 128 => 8364, 129 => 129 /* ?? */, 130 => 8218, @@ -139,6 +135,5 @@ 252 => 252, 253 => 253, 254 => 254, - 255 => 255 - + 255 => 255, ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/iso-8859-15.php spip-4.4.28+dfsg/ecrire/charsets/iso-8859-15.php --- spip-4.4.23+dfsg/ecrire/charsets/iso-8859-15.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/iso-8859-15.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ - * - * @package SPIP\Core\Charsets - **/ - + */ if (!defined('_ECRIRE_INC_VERSION')) { return; } diff -Nru spip-4.4.23+dfsg/ecrire/charsets/iso-8859-6.php spip-4.4.28+dfsg/ecrire/charsets/iso-8859-6.php --- spip-4.4.23+dfsg/ecrire/charsets/iso-8859-6.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/iso-8859-6.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ 0x064F, 0xF0 => 0x0650, 0xF1 => 0x0651, - 0xF2 => 0x0652 + 0xF2 => 0x0652, ]; foreach ($mod as $num => $val) { diff -Nru spip-4.4.23+dfsg/ecrire/charsets/iso-8859-9.php spip-4.4.28+dfsg/ecrire/charsets/iso-8859-9.php --- spip-4.4.23+dfsg/ecrire/charsets/iso-8859-9.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/iso-8859-9.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ - * - * @package SPIP\Core\Charsets - **/ - + */ if (!defined('_ECRIRE_INC_VERSION')) { return; } @@ -24,11 +21,11 @@ load_charset('iso-8859-1'); $trans = $GLOBALS['CHARSET']['iso-8859-1']; -$trans[240] = 287; //gbreve -$trans[208] = 286; //Gbreve -$trans[221] = 304; //Idot -$trans[253] = 305; //inodot -$trans[254] = 351; //scedil -$trans[222] = 350; //Scedil +$trans[240] = 287; // gbreve +$trans[208] = 286; // Gbreve +$trans[221] = 304; // Idot +$trans[253] = 305; // inodot +$trans[254] = 351; // scedil +$trans[222] = 350; // Scedil $GLOBALS['CHARSET']['iso-8859-9'] = $trans; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/mathml.php spip-4.4.28+dfsg/ecrire/charsets/mathml.php --- spip-4.4.23+dfsg/ecrire/charsets/mathml.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/mathml.php 2026-10-07 13:48:22.000000000 +0000 @@ -2,12 +2,8 @@ /** * Déclaration des entités MathML et leur correspondances en écriture unicode - * - * @package SPIP\Core\Charsets - **/ - + */ $GLOBALS['CHARSET']['mathml'] = [ - 'ac' => '', 'acd' => '', 'acE' => '&E#290;', @@ -1690,6 +1686,5 @@ 'zigrarr' => '', 'Zopf' => '', 'Zscr' => '', - 'zscr' => '' - + 'zscr' => '', ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/translit.php spip-4.4.28+dfsg/ecrire/charsets/translit.php --- spip-4.4.23+dfsg/ecrire/charsets/translit.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/translit.php 2026-10-07 13:48:22.000000000 +0000 @@ -3,12 +3,9 @@ /** * Déclaration pour la translitteration simple des correspondances entre * caractères unicodes spécifiques et caractères simples la plage ASCII - * - * @package SPIP\Core\Charsets - **/ - + */ $GLOBALS['CHARSET']['translit'] = [ -// latin [fausse plage] + // latin [fausse plage] 128 => 'EUR', 131 => 'f', 140 => 'OE', @@ -18,7 +15,7 @@ 156 => 'oe', 159 => 'Y', -// latin [legal] + // latin [legal] 160 => ' ', 161 => '!', 162 => 'c', @@ -97,13 +94,13 @@ 252 => 'u', 255 => 'y', -// turc + // turc 286 => 'G', 287 => 'g', 304 => 'I', 305 => 'i', -// esperanto + // esperanto 264 => 'Cx', 265 => 'cx', 284 => 'Gx', @@ -117,8 +114,7 @@ 364 => 'Ux', 365 => 'ux', - -// latin2 [Czech] + // latin2 [Czech] 283 => 'e', 353 => 's', 269 => 'c', @@ -140,13 +136,13 @@ 270 => 'D', 467 => 'O', -// francais + // francais 338 => 'OE', 339 => 'oe', 376 => 'Y', 402 => 'f', -//polskie + // polskie 260 => 'A', 261 => 'a', 262 => 'C', @@ -164,17 +160,17 @@ 379 => 'Z', 380 => 'z', -//roumain + // roumain 258 => 'A', 259 => 'a', 354 => 'T', 355 => 't', -//turc & roumain + // turc & roumain 350 => 'S', 351 => 's', -// cyrillique + // cyrillique 1026 => 'D%', 1027 => 'G%', 8218 => '\'', @@ -288,7 +284,7 @@ 1102 => 'yu', 1103 => 'ya', -// vietnamien en translitteration de base + // vietnamien en translitteration de base 7843 => 'a', 7841 => 'a', 7845 => 'a', @@ -387,6 +383,5 @@ 7926 => 'Y', 7928 => 'Y', 7924 => 'Y', - 273 => 'd' - + 273 => 'd', ]; diff -Nru spip-4.4.23+dfsg/ecrire/charsets/translitcomplexe.php spip-4.4.28+dfsg/ecrire/charsets/translitcomplexe.php --- spip-4.4.23+dfsg/ecrire/charsets/translitcomplexe.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/charsets/translitcomplexe.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,23 +1,20 @@ "a'", 224 => 'a`', 7843 => 'a?', @@ -162,13 +159,13 @@ 273 => 'd-', 208 => 'D-', -// allemand + // allemand 228 => 'ae', 246 => 'oe', 252 => 'ue', 196 => 'Ae', 214 => 'Oe', - 220 => 'Ue' + 220 => 'Ue', ]; foreach ($translit_c as $u => $t) { diff -Nru spip-4.4.23+dfsg/ecrire/composer.json spip-4.4.28+dfsg/ecrire/composer.json --- spip-4.4.23+dfsg/ecrire/composer.json 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/composer.json 2026-10-07 13:48:22.000000000 +0000 @@ -17,10 +17,11 @@ "symfony/polyfill-php81": "^1.31", "symfony/polyfill-php82": "^1.31", "symfony/polyfill-php83": "^1.31", - "symfony/polyfill-php84": "^1.31" + "symfony/polyfill-php84": "^1.31", + "symfony/polyfill-php85": "^1.31" }, "require-dev": { - "symplify/easy-coding-standard": "^12.3" + "spip-league/qa-tools": "^1.0" }, "repositories": { "spip": { @@ -40,5 +41,13 @@ "platform": { "php": "7.4.33" } + }, + "scripts": { + "analyse": "phpstan --memory-limit=1G", + "baseline": "phpstan --memory-limit=1G --generate-baseline --allow-empty-baseline", + "check-cs": "ecs check --ansi", + "fix-cs": "ecs check --fix --ansi", + "rector": "rector process --ansi", + "rector-dry-run": "rector process --dry-run --ansi" } } diff -Nru spip-4.4.23+dfsg/ecrire/exec/403.php spip-4.4.28+dfsg/ecrire/exec/403.php --- spip-4.4.23+dfsg/ecrire/exec/403.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/403.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ ['exec' => '404', 'exec_erreur' => $exec], 'data' => '']); + echo pipeline('affiche_gauche', [ + 'args' => [ + 'exec' => '404', + 'exec_erreur' => $exec, + ], + 'data' => '', + ]); echo creer_colonne_droite(); - echo pipeline('affiche_droite', ['args' => ['exec' => '404', 'exec_erreur' => $exec], 'data' => '']); + echo pipeline('affiche_droite', [ + 'args' => [ + 'exec' => '404', + 'exec_erreur' => $exec, + ], + 'data' => '', + ]); echo debut_droite(); echo "

    " . _T('fichier_introuvable', ['fichier' => $exec]) . '

    '; diff -Nru spip-4.4.23+dfsg/ecrire/exec/admin_plugin.php spip-4.4.28+dfsg/ecrire/exec/admin_plugin.php --- spip-4.4.23+dfsg/ecrire/exec/admin_plugin.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/admin_plugin.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ ['exec' => 'admin_plugin'], - 'data' => afficher_librairies() + 'data' => afficher_librairies(), ] ); @@ -168,7 +165,7 @@ } } - if ($quoi == 'actifs' or $lpf) { + if ($quoi == 'actifs' || $lpf) { $nb = is_countable($lcpa) ? count($lcpa) : 0; if (defined('_DIR_PLUGINS_SUPPL')) { $nb += is_countable($lcpas) ? count($lcpas) : 0; @@ -237,7 +234,7 @@ 'affiche_milieu', [ 'args' => ['exec' => 'admin_plugin'], - 'data' => '' + 'data' => '', ] ); @@ -253,7 +250,7 @@ * Liste des plugins actifs * @return string * Code HTML - **/ + */ function affiche_les_plugins_verrouilles($actifs) { if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) { return ''; @@ -298,7 +295,6 @@ return $res; } - /** * Faire la liste des librairies disponibles * @@ -309,13 +305,11 @@ $libs = []; foreach (array_reverse(creer_chemin()) as $d) { if ( - is_dir($dir = $d . 'lib/') - and $t = opendir($dir) + is_dir($dir = $d . 'lib/') && $t = opendir($dir) ) { while (($f = readdir($t)) !== false) { if ( - $f[0] != '.' - and is_dir("$dir/$f") + $f[0] != '.' && is_dir("$dir/$f") ) { $libs[$f] = $dir; } diff -Nru spip-4.4.23+dfsg/ecrire/exec/base_delete_all.php spip-4.4.28+dfsg/ecrire/exec/base_delete_all.php --- spip-4.4.23+dfsg/ecrire/exec/base_delete_all.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/base_delete_all.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,29 +1,26 @@ '._T('info_version_base_plus_recente').'

    '; + echo '

    ' . _T('info_version_base_plus_recente') . '

    '; echo boite_fermer(); } else { echo boite_ouvrir(_T('info_message_technique'), 'notice'); echo '

    ' . _T('info_procedure_maj_version') . '

    ', - '

    ' . _T('info_administrateur_site_01') . '

    '; + '

    ' . _T('info_administrateur_site_01') . '

    '; echo bouton_action(_T('bouton_mettre_a_jour_base'), generer_url_ecrire('upgrade', 'reinstall=non')); echo boite_fermer(); } diff -Nru spip-4.4.23+dfsg/ecrire/exec/fond.php spip-4.4.28+dfsg/ecrire/exec/fond.php --- spip-4.4.23+dfsg/ecrire/exec/fond.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/fond.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,13 +1,13 @@ page(); @@ -49,23 +44,21 @@ * Fonction appelée en cas d'arrêt de php sur une erreur * * @todo supprimer cette fonction vide ? - **/ + */ function shutdown_error() { // si on arrive ici avec un tampon non ferme : erreur fatale /* if (ob_get_level()){ - // envoyer tous les tampons - while (ob_get_level()) - ob_end_flush(); - - var_dump(error_get_last()); - #echo "
    "."Erreur fatale (memoire ?)
    "; - @flush(); - }*/ + * // envoyer tous les tampons + * while (ob_get_level()) + * ob_end_flush(); + * var_dump(error_get_last()); + * #echo "
    "."Erreur fatale (memoire ?)
    "; + * @flush(); + * }*/ } register_shutdown_function('shutdown_error'); - // on retient l'envoi de html pour pouvoir tout jeter et generer une 403 // si on tombe sur un filtre sinon_interdire_acces // il faudrait etre capable de flusher cela des que le contenu principal est genere diff -Nru spip-4.4.23+dfsg/ecrire/exec/info_plugin.php spip-4.4.28+dfsg/ecrire/exec/info_plugin.php --- spip-4.4.23+dfsg/ecrire/exec/info_plugin.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/info_plugin.php 2026-10-07 13:48:22.000000000 +0000 @@ -4,10 +4,7 @@ /** * Gestion d'affichage d'un descriptif de plugin en ajax - * - * @package SPIP\Core\Exec */ - if (!defined('_ECRIRE_INC_VERSION')) { return; } @@ -30,9 +27,9 @@ $plug = _DIR_RACINE . htmlspecialchars(_request('plugin')); $get_infos = charger_fonction('get_infos', 'plugins'); $dir = ''; - if (strncmp($plug, _DIR_PLUGINS, strlen(_DIR_PLUGINS)) == 0) { + if (str_starts_with($plug, _DIR_PLUGINS)) { $dir = _DIR_PLUGINS; - } elseif (strncmp($plug, _DIR_PLUGINS_DIST, strlen(_DIR_PLUGINS_DIST)) == 0) { + } elseif (str_starts_with($plug, _DIR_PLUGINS_DIST)) { $dir = _DIR_PLUGINS_DIST; } if ($dir) { diff -Nru spip-4.4.23+dfsg/ecrire/exec/informer.php spip-4.4.28+dfsg/ecrire/exec/informer.php --- spip-4.4.23+dfsg/ecrire/exec/informer.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/exec/informer.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $GLOBALS['meta']['dernier_envoi_neuf'], 'jours_neuf' => $jours_neuf], + [ + 'date' => $GLOBALS['meta']['dernier_envoi_neuf'], + 'jours_neuf' => $jours_neuf, + ], ['raw' => true] ); if (strlen(trim($page['texte']))) { // recuperer les entetes envoyes par #HTTP_HEADER $headers = ''; - if (isset($page['entetes']) and is_countable($page['entetes']) ? count($page['entetes']) : 0) { + if (isset($page['entetes']) && (is_countable($page['entetes']) ? count($page['entetes']) : 0)) { foreach ($page['entetes'] as $k => $v) { $headers .= (strlen($v) ? "$k: $v" : $k) . "\n"; } diff -Nru spip-4.4.23+dfsg/ecrire/genie/maintenance.php spip-4.4.28+dfsg/ecrire/genie/maintenance.php --- spip-4.4.23+dfsg/ecrire/genie/maintenance.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/genie/maintenance.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $desc) { if ( !sql_select('*', $table, '', '', '', 1) - and !defined('spip_interdire_cache') + && !defined('spip_interdire_cache') ) { # cas "LOST CONNECTION" - $crash[] = $table; + $crash[] = $table; } } } - #$crash[] = 'test'; + # $crash[] = 'test'; if ($crash) { ecrire_meta('message_crash_tables', serialize($crash)); spip_log('crash des tables', 'err'); diff -Nru spip-4.4.23+dfsg/ecrire/genie/mise_a_jour.php spip-4.4.28+dfsg/ecrire/genie/mise_a_jour.php --- spip-4.4.23+dfsg/ecrire/genie/mise_a_jour.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/genie/mise_a_jour.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $last_modified, - 'file' => $tmp_file + 'file' => $tmp_file, ]); // si il y a une version plus recente que l'on a recu correctement if ( $res['status'] == 200 - and $res['length'] - and $tmp_file = $res['file'] + && $res['length'] + && ($tmp_file = $res['file']) ) { if ($md5 !== md5_file($tmp_file)) { // on essaye de l'inclure pour verifier que ca ne fait pas erreur fatale @@ -167,7 +163,7 @@ $res = recuperer_url_cache(_VERSIONS_SERVEUR, $options); // Si rien de neuf (ou inaccessible), garder l'ancienne - if ($res and $res['page']) { + if ($res && $res['page']) { $contenu = $res['page']; ecrire_fichier($nom, $contenu); } @@ -222,17 +218,17 @@ // d'abord les mises à jour de la même branche (version mineure) if ( spip_version_compare($version, $version_maj, '<') - and spip_version_compare($maj['mineure'], $version_maj, '<') - and spip_version_compare($branche, $branche_maj, '=') + && spip_version_compare($maj['mineure'], $version_maj, '<') + && spip_version_compare($branche, $branche_maj, '=') ) { $maj['mineure'] = $version_maj; } // puis les mises à jours majeures if ( $is_version_stable - and spip_version_compare($version, $version_maj, '<') - and spip_version_compare($maj['majeure'], $version_maj, '<') - and spip_version_compare($branche, $branche_maj, '<') + && spip_version_compare($version, $version_maj, '<') + && spip_version_compare($maj['majeure'], $version_maj, '<') + && spip_version_compare($branche, $branche_maj, '<') ) { $maj['majeure'] = $version_maj; } @@ -241,7 +237,6 @@ return $maj; } - /** * Notifier les webmestre d’une nouvelle version existante (pour mettre à jour) * @@ -268,7 +263,7 @@ notifications_envoyer_mails( $destinataires, $texte, - '['. $GLOBALS['meta']['nom_site'] .'] '. _T('nouvelle_version_spip', ['version' => $version]) + '[' . $GLOBALS['meta']['nom_site'] . '] ' . _T('nouvelle_version_spip', ['version' => $version]) ); } } diff -Nru spip-4.4.23+dfsg/ecrire/genie/optimiser.php spip-4.4.28+dfsg/ecrire/genie/optimiser.php --- spip-4.4.23+dfsg/ecrire/genie/optimiser.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/genie/optimiser.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ time() - 48 * 3600, 'limit' => 10000]); + purger_repertoire($d, [ + 'mtime' => time() - 48 * 3600, + 'limit' => 10000, + ]); } } @@ -65,13 +65,11 @@ * Heure de référence pour le garbage collector = 24h auparavant * @param int $attente * Attente entre 2 exécutions de la tache en secondes - * @return void - **/ + */ function optimiser_base($attente = 86400) { optimiser_base_disparus($attente); } - /** * Lance une requête d'optimisation sur une des tables SQL de la * base de données. @@ -82,7 +80,7 @@ * @see sql_optimize() * * @global int $GLOBALS ['meta']['optimiser_table'] - **/ + */ function optimiser_base_une_table() { $tables = []; @@ -109,7 +107,6 @@ } } - /** * Supprime des enregistrements d'une table SQL dont les ids à supprimer * se trouvent dans les résultats de ressource SQL transmise, sous la colonne 'id' @@ -123,14 +120,14 @@ * Nom de la table SQL, exemple : spip_articles * @param string $id * Nom de la clé primaire de la table, exemple : id_article - * @param Object $sel + * @param object $sel * Ressource SQL issue d'une sélection (sql_select) et contenant une * colonne 'id' ayant l'identifiant de la clé primaire à supprimer * @param string $and * Condition AND à appliquer en plus sur la requête de suppression * @return int * Nombre de suppressions - **/ + */ function optimiser_sansref($table, $id, $sel, $and = '') { $in = []; while ($row = sql_fetch($sel)) { @@ -146,7 +143,6 @@ return count($in); } - /** * Suppression des liens morts entre tables * @@ -161,8 +157,7 @@ * * @param int $attente * Attente entre 2 exécutions de la tache en secondes - * @return void - **/ + */ function optimiser_base_disparus($attente = 86400) { # format = 20060610110141, si on veut forcer une optimisation tout de suite @@ -235,11 +230,10 @@ $n = pipeline('optimiser_base_disparus', [ 'args' => [ 'attente' => $attente, - 'date' => $mydate + 'date' => $mydate, ], - 'data' => $n + 'data' => $n, ]); - spip_log("optimiser_base_disparus : {$n} lien(s) mort(s)", 'genie' . _LOG_DEBUG); } diff -Nru spip-4.4.23+dfsg/ecrire/inc/acces.php spip-4.4.28+dfsg/ecrire/inc/acces.php --- spip-4.4.23+dfsg/ecrire/inc/acces.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/acces.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $var) { if ($var) { - if ($val <> 'statut') { + if ($val != 'statut') { $a .= ':' . $val . '-' . $var; } $b .= $val . '=' . $var . '&'; @@ -291,7 +278,7 @@ * Action désirée * @return string * Clé - **/ + */ function afficher_low_sec($id_auteur, $action = '') { return substr(md5($action . low_sec($id_auteur)), 0, 8); } @@ -309,7 +296,7 @@ * Action désirée * @return bool * true si les clés corresponde, false sinon - **/ + */ function verifier_low_sec( $id_auteur, #[\SensitiveParameter] @@ -324,7 +311,7 @@ * * @param int $id_auteur * Identifiant de l'auteur - **/ + */ function effacer_low_sec($id_auteur) { if (!$id_auteur = intval($id_auteur)) { return; @@ -332,7 +319,6 @@ sql_updateq('spip_auteurs', ['low_sec' => ''], 'id_auteur = ' . intval($id_auteur)); } - /** * Créer un fichier htpasswd * @@ -345,7 +331,7 @@ * @return null|void * - null si pas de htpasswd à créer, ou si LDAP * - void sinon. - **/ + */ function ecrire_acces() { $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; $htpasswd = _DIR_TMP . _AUTH_USER_FILE; @@ -354,9 +340,8 @@ // par exemple acces_restreint ; // si .htaccess existe, outrepasser spip_meta if ( - (!isset($GLOBALS['meta']['creer_htpasswd']) - or ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) - and !@file_exists($htaccess) + (!isset($GLOBALS['meta']['creer_htpasswd']) || $GLOBALS['meta']['creer_htpasswd'] != 'oui') + && !@file_exists($htaccess) ) { spip_unlink($htpasswd); spip_unlink($htpasswd . '-admin'); @@ -367,7 +352,7 @@ # de devenir redacteur le cas echeant (auth http)... a nettoyer // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) // TODO: factoriser avec auth/spip qui fait deja ce job et generaliser le test auth_ldap_connect() - if (include_spip('auth/ldap') and auth_ldap_connect()) { + if (include_spip('auth/ldap') && auth_ldap_connect()) { return; } @@ -376,8 +361,6 @@ /** * Generer le fichier de htpasswd contenant les htpass - * @param $htpasswd - * @param $htpasswd_admin */ function generer_htpasswd_files($htpasswd, $htpasswd_admin) { if ($generer_htpasswd = charger_fonction('generer_htpasswd_files', 'inc', true)) { @@ -389,7 +372,7 @@ $res = sql_select('login, htpass, statut', 'spip_auteurs', "htpass!='' AND login!='' AND " . sql_in('statut', ['1comite', '0minirezo', 'nouveau'])); while ($row = sql_fetch($res)) { - if (strlen($row['login']) and strlen($row['htpass'])) { + if (strlen($row['login']) && strlen($row['htpass'])) { $ligne = $row['login'] . ':' . $row['htpass'] . "\n"; $pwd_all .= $ligne; if ($row['statut'] == '0minirezo') { @@ -408,7 +391,7 @@ /** * Créer un password htaccess * - * @link http://docs.php.net/manual/fr/function.crypt.php Documentation de `crypt()` + * @see http://docs.php.net/manual/fr/function.crypt.php Documentation de `crypt()` * * @param string $pass * Le mot de passe @@ -433,11 +416,11 @@ * @param string $rep * Nom du répertoire où SPIP doit vérifier l'existence d'un fichier .htaccess * @param bool $force - * @return boolean + * @return bool */ function verifier_htaccess($rep, $force = false) { $htaccess = rtrim($rep, '/') . '/' . _ACCESS_FILE_NAME; - if (((@file_exists($htaccess)) or defined('_TEST_DIRS')) and !$force) { + if ((@file_exists($htaccess) || defined('_TEST_DIRS')) && !$force) { return true; } @@ -454,9 +437,7 @@ '; // support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD) if ( - function_exists('apache_get_version') - and $v = apache_get_version() - and strncmp($v, 'Apache/1.', 9) == 0 + function_exists('apache_get_version') && ($v = apache_get_version()) && str_starts_with($v, 'Apache/1.') ) { $deny = "deny from all\n"; } @@ -497,7 +478,7 @@ function gerer_htaccess() { // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint - $f = (isset($GLOBALS['meta']['creer_htaccess']) and ($GLOBALS['meta']['creer_htaccess'] === 'oui')); + $f = (isset($GLOBALS['meta']['creer_htaccess']) && $GLOBALS['meta']['creer_htaccess'] === 'oui'); $dirs = sql_allfetsel('extension', 'spip_types_documents'); $dirs[] = ['extension' => 'distant']; foreach ($dirs as $e) { diff -Nru spip-4.4.23+dfsg/ecrire/inc/actions.php spip-4.4.28+dfsg/ecrire/inc/actions.php --- spip-4.4.23+dfsg/ecrire/inc/actions.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/actions.php 2026-10-07 13:48:22.000000000 +0000 @@ -13,10 +13,7 @@ /** * Gestion des actions sécurisées - * - * @package SPIP\Core\Actions - **/ - + */ if (!defined('_ECRIRE_INC_VERSION')) { return; } @@ -111,7 +108,6 @@ return generer_action_auteur($action, $arg, $r, $corps, $att . " method='post'"); } - /** * Fonction de formatage du contenu renvoyé en ajax * @@ -126,24 +122,24 @@ */ function ajax_retour($corps, $content_type = null): void { $xml = false; - if (is_null($content_type) or $content_type === true) { + if ($content_type === null || $content_type === true) { $xml = true; $content_type = 'text/html'; - } elseif (!$content_type or !is_string($content_type) or !str_contains($content_type, '/')) { + } elseif (!$content_type || !is_string($content_type) || !str_contains($content_type, '/')) { $content_type = 'text/html'; } $e = ''; if ( isset($_COOKIE['spip_admin']) - and ((_request('var_mode') == 'debug') or !empty($GLOBALS['tableau_des_temps'])) + && (_request('var_mode') == 'debug' || !empty($GLOBALS['tableau_des_temps'])) ) { $e = erreur_squelette(); } $c = $GLOBALS['meta']['charset']; header('Content-Type: ' . $content_type . '; charset=' . $c); - $debut = (($xml and strlen(trim($corps))) ? '<' . "?xml version='1.0' encoding='" . $c . "'?" . ">\n" : ''); + $debut = (($xml && strlen(trim($corps))) ? '<' . "?xml version='1.0' encoding='" . $c . "'?>\n" : ''); $fin = ''; echo $debut, $corps, $fin, $e; diff -Nru spip-4.4.23+dfsg/ecrire/inc/admin.php spip-4.4.28+dfsg/ecrire/inc/admin.php --- spip-4.4.23+dfsg/ecrire/inc/admin.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/admin.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ page('', ['titre' => _T('info_travaux_texte'), 'status' => 503]); + return $minipage->page('', [ + 'titre' => _T('info_travaux_texte'), + 'status' => 503, + ]); } } } @@ -138,7 +138,7 @@ * * @return string * Chemin du répertoire. - **/ + */ function dir_admin() { if (autoriser('configurer')) { return _DIR_TMP; @@ -159,7 +159,7 @@ * Préfixe au nom du fichier calculé * @return string * Nom du fichier - **/ + */ function fichier_admin($action, $pref = 'admin_') { return $pref . substr(md5($action . (time() & ~2047) . $GLOBALS['visiteur_session']['login']), 0, 10); @@ -186,9 +186,9 @@ * @return string * Code HTML de la page (pour vérifier les droits), * sinon chaîne vide si déjà fait. - **/ + */ function debut_admin($script, $action = '', $corps = '') { - if ((!$action) || !(autoriser('webmestre') or autoriser('chargerftp'))) { + if ((!$action) || !(autoriser('webmestre') || autoriser('chargerftp'))) { $minipage = new MinipageAdmin(); return $minipage->page(); @@ -204,8 +204,8 @@ // Si on est un super-admin, un bouton de validation suffit // sauf dans les cas destroy if ( - (autoriser('webmestre') or $script === 'repair') - and $script != 'delete_all' + (autoriser('webmestre') || $script === 'repair') + && $script != 'delete_all' ) { if (_request('validation_admin') == $signal) { spip_log("Action super-admin: $action"); @@ -263,7 +263,7 @@ * * @param string $action * Nom de l'action (en base) qui a été exécutée - **/ + */ function fin_admin($action) { $signal = dir_admin() . fichier_admin($action); spip_unlink($signal); @@ -288,11 +288,11 @@ * texte du bouton de validation * @return string * Code HTML du formulaire - **/ + */ function copy_request($script, $suite, $submit = '') { include_spip('inc/filtres'); foreach (array_merge($_POST, $_GET) as $n => $c) { - if (!in_array($n, ['fichier', 'exec', 'validation_admin']) and !is_array($c)) { + if (!in_array($n, ['fichier', 'exec', 'validation_admin']) && !is_array($c)) { $suite .= "\n"; diff -Nru spip-4.4.23+dfsg/ecrire/inc/auth.php spip-4.4.28+dfsg/ecrire/inc/auth.php --- spip-4.4.23+dfsg/ecrire/inc/auth.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/auth.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ $GLOBALS['connect_login'], - 'site' => generer_url_public('', 'action=logout&logout=prive') + 'site' => generer_url_public('', 'action=logout&logout=prive'), ]; } @@ -67,8 +64,6 @@ /** * Vérifier qu'un mot de passe saisi pour confirmer une action est bien celui de l'auteur connecté - * @param string $password - * @return bool */ function auth_controler_password_auteur_connecte( #[\SensitiveParameter] @@ -77,7 +72,7 @@ if ( empty($GLOBALS['visiteur_session']['id_auteur']) - or empty($GLOBALS['visiteur_session']['login']) + || empty($GLOBALS['visiteur_session']['login']) ) { return false; } @@ -85,7 +80,7 @@ $auth = auth_identifier_login($GLOBALS['visiteur_session']['login'], $password, '', true); if ( is_array($auth) - and $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur'] + && $auth['id_auteur'] == $GLOBALS['visiteur_session']['id_auteur'] ) { return true; } @@ -98,7 +93,6 @@ * en cas de refus de connexion. * Retourne un message a afficher ou redirige illico. * - * @param $raison * @return array|string */ function auth_echec($raison) { @@ -121,14 +115,14 @@ } elseif (@$raison['statut']) { // un simple visiteur n'a pas acces a l'espace prive spip_log('connexion refusee a ' . @$raison['id_auteur']); - $est_connecte = (!empty($GLOBALS['visiteur_session']['login']) and !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT + $est_connecte = (!empty($GLOBALS['visiteur_session']['login']) && !empty($GLOBALS['visiteur_session']['statut'])); // idem test balise #URL_LOGOUT $raison = $minipage->page( _T('avis_erreur_visiteur') // Lien vers le site public . '
    ' . _T('login_retour_public') . '' // Si la personne est connectée, lien de déconnexion ramenant vers la page de login . ($est_connecte ? ' | ' . _T('icone_deconnecter') . '' : ''), - ['titre' => _T('avis_erreur_connexion')] + ['titre' => _T('avis_erreur_connexion')] ); } else { // auteur en fin de droits ... @@ -183,15 +177,12 @@ // (ignorer les login d'intranet independants de spip) if (!$GLOBALS['ignore_auth_http']) { if ( - (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW']) - and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) - or - // Si auth http differtente de basic, PHP_AUTH_PW - // est indisponible mais tentons quand meme pour - // autocreation via LDAP - (isset($_SERVER['REMOTE_USER']) - and $_SERVER['REMOTE_USER'] !== '' - and $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], '')) + isset($_SERVER['PHP_AUTH_USER']) + && isset($_SERVER['PHP_AUTH_PW']) + && ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) + || isset($_SERVER['REMOTE_USER']) + && $_SERVER['REMOTE_USER'] !== '' + && ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], '')) ) { if (!$id_auteur) { $_SERVER['PHP_AUTH_PW'] = ''; @@ -216,8 +207,9 @@ } } - $where = (is_numeric($id_auteur) - /*AND $id_auteur>0*/ // reprise lors des restaurations + $where = ( + is_numeric($id_auteur) + /* AND $id_auteur>0 */ // reprise lors des restaurations ) ? "id_auteur=$id_auteur" : (!strlen($GLOBALS['connect_login']) ? '' : 'login=' . sql_quote($GLOBALS['connect_login'], '', 'text')); @@ -252,7 +244,6 @@ return false; } - if ($row['statut'] == 'nouveau') { include_spip('action/inscrire_auteur'); $row = confirmer_statut_inscription($row); @@ -278,14 +269,12 @@ $r = @unserialize($row['prefs']); $GLOBALS['visiteur_session']['prefs'] = ($r ?: []); // si prefs pas definies, les definir par defaut - if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) { - $GLOBALS['visiteur_session']['prefs']['couleur'] = 2; - } + $GLOBALS['visiteur_session']['prefs']['couleur'] ??= 2; $GLOBALS['visiteur_session'] = pipeline( 'preparer_visiteur_session', ['args' => ['row' => $row], - 'data' => $GLOBALS['visiteur_session']] + 'data' => $GLOBALS['visiteur_session']] ); // Etablir les droits selon le codage attendu @@ -308,7 +297,7 @@ if (in_array($GLOBALS['connect_statut'], explode(',', _STATUT_AUTEUR_RUBRIQUE))) { if ( isset($GLOBALS['visiteur_session']['restreint']) - and is_array($GLOBALS['visiteur_session']['restreint']) + && is_array($GLOBALS['visiteur_session']['restreint']) ) { $GLOBALS['connect_id_rubrique'] = $GLOBALS['visiteur_session']['restreint']; } @@ -350,7 +339,8 @@ $redirect = parametre_url( $redirect, 'var_erreur', - (!isset($GLOBALS['visiteur_session']['statut']) + ( + !isset($GLOBALS['visiteur_session']['statut']) ? 'cookie' : 'statut' ), @@ -385,7 +375,6 @@ pipeline('trig_auth_trace', ['args' => ['row' => $row, 'date' => $date]]); } - /** ---------------------------------------------------------------------------- * API Authentification, gestion des identites centralisees */ @@ -424,9 +413,9 @@ 'args' => [ 'fonction' => $fonction, 'methode' => $auth_methode, - 'args' => $args + 'args' => $args, ], - 'data' => $res + 'data' => $res, ] ); return $res; @@ -446,7 +435,6 @@ return $flux; } - /** * Retrouver le login interne lie a une info login saisie * la saisie peut correspondre a un login delegue @@ -489,8 +477,8 @@ function auth_informer_login($login, $serveur = '') { if ( !$login - or !$login_base = auth_retrouver_login($login, $serveur) - or !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur) + || !($login_base = auth_retrouver_login($login, $serveur)) + || !($row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login_base, $serveur, 'text'), '', '', '', '', $serveur)) ) { // generer de fausses infos, mais credibles, pour eviter une attaque // https://core.spip.net/issues/1758 + https://core.spip.net/issues/3691 @@ -509,7 +497,7 @@ $infos = [ 'id_auteur' => $row['id_auteur'], 'login' => $row['login'], - 'cnx' => (isset($prefs['cnx']) and $prefs['cnx'] === 'perma') ? '1' : '0', + 'cnx' => (isset($prefs['cnx']) && $prefs['cnx'] === 'perma') ? '1' : '0', 'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row), ]; @@ -518,7 +506,6 @@ return auth_administrer('informer_login', [$row['source'], $infos, $row, $serveur], $infos); } - /** * Essayer les differentes sources d'authenfication dans l'ordre specifie. * S'en souvenir dans visiteur_session['auth'] @@ -539,11 +526,12 @@ foreach ($GLOBALS['liste_des_authentifications'] as $methode) { if ($auth = charger_fonction($methode, 'auth', true)) { $auteur = $auth($login, $password, $serveur, $phpauth); - if (is_array($auteur) and count($auteur)) { + if (is_array($auteur) && count($auteur)) { spip_log("connexion de $login par methode $methode"); $auteur['auth'] = $methode; return $auteur; - } elseif (is_string($auteur)) { + } + if (is_string($auteur)) { $erreur .= "$auteur "; } } @@ -590,7 +578,7 @@ * @return bool */ function auth_loger($auteur) { - if (!is_array($auteur) or !count($auteur)) { + if (!is_array($auteur) || !count($auteur)) { return false; } @@ -602,7 +590,7 @@ // initialiser les prefs $p = $GLOBALS['visiteur_session']['prefs']; - $p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : ''; + $p['cnx'] = (isset($auteur['cookie']) && $auteur['cookie'] == 'oui') ? 'perma' : ''; sql_updateq( 'spip_auteurs', @@ -620,7 +608,7 @@ * * @uses action_logout_dist() * return void - **/ + */ function auth_deloger() { $logout = charger_fonction('logout', 'action'); $logout(); @@ -700,7 +688,8 @@ * message d'erreur ou chaine vide si pas d'erreur */ function auth_verifier_pass( - $auth_methode, $login, + $auth_methode, + $login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, @@ -744,7 +733,6 @@ * @param array $champs * @param array $options * @param string $serveur - * @return void */ function auth_synchroniser_distant( $auth_methode = true, @@ -754,7 +742,7 @@ $serveur = '' ) { $args = func_get_args(); - if ($auth_methode === true or (isset($options['all']) and $options['all'] == true)) { + if ($auth_methode === true || isset($options['all']) && $options['all'] == true) { $options['all'] = true; // ajouter une option all=>true pour chaque auth $args = [true, $id_auteur, $champs, $options, $serveur]; foreach ($GLOBALS['liste_des_authentifications'] as $methode) { @@ -767,7 +755,6 @@ } } - /** * Vérifier si l'auteur est bien authentifié * @@ -784,7 +771,7 @@ ) { if ( !$login - or !$login_base = auth_retrouver_login($login, $serveur) + || !($login_base = auth_retrouver_login($login, $serveur)) ) { return false; } @@ -794,8 +781,8 @@ if (!$row) { if ( include_spip('inc/auth') - and auth_ldap_connect($serveur) - and $auth_ldap = charger_fonction('ldap', 'auth', true) + && auth_ldap_connect($serveur) + && ($auth_ldap = charger_fonction('ldap', 'auth', true)) ) { return $auth_ldap($login_base, $pw, $serveur, true); } @@ -806,8 +793,8 @@ // si pas de source definie // ou auth/xxx introuvable, utiliser 'spip' ou autre et avec le login passé par PHP_AUTH_USER if ( - !$auth_methode = $row['source'] - or !$auth = charger_fonction($auth_methode, 'auth', true) + !($auth_methode = $row['source']) + || !($auth = charger_fonction($auth_methode, 'auth', true)) ) { $auth = charger_fonction('spip', 'auth', true); } @@ -817,7 +804,7 @@ $auteur = $auth($login, $pw, $serveur, true); } // verifier que ce n'est pas un message d'erreur - if (is_array($auteur) and count($auteur)) { + if (is_array($auteur) && count($auteur)) { return $auteur; } @@ -835,8 +822,8 @@ * @param string $lien */ function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = '') { - @Header('WWW-Authenticate: Basic realm="espace prive"'); - @Header('HTTP/1.0 401 Unauthorized'); + @header('WWW-Authenticate: Basic realm="espace prive"'); + @header('HTTP/1.0 401 Unauthorized'); $corps = ''; $public = generer_url_public(); $ecrire = generer_url_ecrire(); diff -Nru spip-4.4.23+dfsg/ecrire/inc/autoriser.php spip-4.4.28+dfsg/ecrire/inc/autoriser.php --- spip-4.4.23+dfsg/ecrire/inc/autoriser.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/autoriser.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,21 +1,19 @@ getCwd() . DIRECTORY_SEPARATOR . $f); + include_once app() + ->getCwd() . DIRECTORY_SEPARATOR . $f; } - /** * Autoriser une action * @@ -152,13 +148,11 @@ */ function autoriser_dist(string $faire, ?string $type = '', $id = null, $qui = null, array $opt = []): bool { - if ($type === null) { - $type = ''; - } + $type ??= ''; // Qui ? visiteur_session ? // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge - if ($qui === null or $qui === '') { + if ($qui === null || $qui === '') { $qui = $GLOBALS['visiteur_session'] ?: []; $qui = array_merge(['statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'], $qui); } elseif (is_numeric($qui)) { @@ -170,7 +164,7 @@ // Admins restreints, on construit ici (pas generique mais...) // le tableau de toutes leurs rubriques (y compris les sous-rubriques) - if (_ADMINS_RESTREINTS and is_array($qui)) { + if (_ADMINS_RESTREINTS && is_array($qui)) { $qui['restreint'] = isset($qui['id_auteur']) ? liste_rubriques_auteur($qui['id_auteur']) : []; } @@ -179,16 +173,17 @@ 'autoriser' . _LOG_DEBUG ); - $type = autoriser_type($type); + $type_normalise = autoriser_type($type); // Si une exception a ete decretee plus haut dans le code, l'appliquer if ( - (isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) and autoriser_exception($faire, $type, $id, 'verifier')) - or (isset($GLOBALS['autoriser_exception'][$faire][$type]['*']) and autoriser_exception($faire, $type, '*', 'verifier')) + isset($GLOBALS['autoriser_exception'][$faire][$type_normalise][$id]) && autoriser_exception($faire, $type, $id, 'verifier') + || isset($GLOBALS['autoriser_exception'][$faire][$type_normalise]['*']) && autoriser_exception($faire, $type, '*', 'verifier') ) { spip_log("autoriser ($faire, $type, $id, " . ($qui['nom'] ?? '') . ') : OK Exception', 'autoriser' . _LOG_DEBUG); return true; } + $type = $type_normalise; // Chercher une fonction d'autorisation // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist], @@ -197,18 +192,18 @@ ? [ 'autoriser_' . $type . '_' . $faire, 'autoriser_' . $type . '_' . $faire . '_dist', - 'autoriser_' . $type, - 'autoriser_' . $type . '_dist', + 'autoriser_' . $type . '_faire', + 'autoriser_' . $type . '_faire_dist', 'autoriser_' . $faire, 'autoriser_' . $faire . '_dist', 'autoriser_defaut', - 'autoriser_defaut_dist' + 'autoriser_defaut_dist', ] : [ 'autoriser_' . $faire, 'autoriser_' . $faire . '_dist', 'autoriser_defaut', - 'autoriser_defaut_dist' + 'autoriser_defaut_dist', ]; $a = false; @@ -225,8 +220,8 @@ ); if (!is_bool($a)) { - trigger_error(sprintf("Function %s should returns a boolean instead of %s (casts as boolean). This will trigger fatal error in future versions.", $f, gettype($a)), \E_USER_DEPRECATED); - $a = (bool) $a; + trigger_error(sprintf('Function %s should returns a boolean instead of %s (casts as boolean). This will trigger fatal error in future versions.', $f, gettype($a)), \E_USER_DEPRECATED); + $a = (bool) $a; } return $a; @@ -246,15 +241,12 @@ * @param string|bool $autoriser accorder (true) ou revoquer (false) * - bool Accorder ou révoquer * - 'verifier' : test si une exception existe - * @return bool */ function autoriser_exception(string $faire, ?string $type = '', $id = null, $autoriser = true): bool { // une static innaccessible par url pour verifier que la globale est positionnee a bon escient static $autorisation; // Tolérance avec certains appels - if ($id === null) { - $id = 0; - } + $id ??= 0; $type = autoriser_type($type); if ($autoriser === 'verifier') { return isset($autorisation[$faire][$type][$id]); @@ -266,8 +258,7 @@ if ($id === '*') { unset($GLOBALS['autoriser_exception'][$faire][$type]); unset($autorisation[$faire][$type]); - } - else { + } else { unset($GLOBALS['autoriser_exception'][$faire][$type][$id]); unset($autorisation[$faire][$type][$id]); } @@ -295,7 +286,6 @@ return str_replace('_', '', (string) $type); } - /** * Autorisation par defaut * @@ -309,11 +299,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_defaut_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - $qui['statut'] === '0minirezo' - and !$qui['restreint']; + return $qui['statut'] === '0minirezo' && !$qui['restreint']; } /** @@ -350,9 +338,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_ecrire_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return isset($qui['statut']) and in_array($qui['statut'], ['0minirezo', '1comite']); + return isset($qui['statut']) && in_array($qui['statut'], ['0minirezo', '1comite']); } /** @@ -369,7 +357,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_creer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return in_array($qui['statut'], ['0minirezo', '1comite']); } @@ -388,11 +376,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_previsualiser_dist(string $faire, string $type, $id, array $qui, array $opt): bool { // Le visiteur a-t-il un statut prevu par la config ? - if (strpos($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',') !== false) { + if (str_contains($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',')) { return test_previsualiser_objet_champ($type, $id, $qui, $opt); } @@ -422,7 +410,6 @@ * * @uses lister_tables_objets_sql() * - * @param string $faire Action demandée * @param string $type Type d'objet ou élément * @param int|string|null $id Identifiant * @param array $qui Description de l'auteur demandant l'autorisation @@ -464,7 +451,8 @@ if (!$id_auteur) { return false; - } elseif (autoriser('previsualiser' . $opt[$champ], $type, 0, $id_auteur)) { + } + if (autoriser('previsualiser' . $opt[$champ], $type, 0, $id_auteur)) { // dans ce cas (admin en general), pas de filtrage sur ce statut } elseif ( !sql_countsel( @@ -496,20 +484,20 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_changerlangue_dist(string $faire, string $type, $id, array $qui, array $opt): bool { $multi_objets = explode(',', lire_config('multi_objets')); $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets')); $table = table_objet_sql($type); if ( in_array($table, $multi_objets) - or in_array($table, $gerer_trad_objets) + || in_array($table, $gerer_trad_objets) ) { // affichage du formulaire si la configuration l'accepte $multi_secteurs = lire_config('multi_secteurs'); $champs = objet_info($type, 'field'); if ( $multi_secteurs === 'oui' - and array_key_exists('id_rubrique', $champs) + && array_key_exists('id_rubrique', $champs) ) { // multilinguisme par secteur et objet rattaché à une rubrique $primary = id_table_objet($type); @@ -556,7 +544,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_changertraduction_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('modifier', $type, $id, $qui, $opt); } @@ -572,7 +560,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_dater_dist(string $faire, string $type, $id, array $qui, array $opt): bool { $table = table_objet($type); $trouver_table = charger_fonction('trouver_table', 'base'); @@ -603,7 +591,7 @@ if ( in_array($statut, $statuts_publies) // Ou cas particulier géré en dur ici pour les articles - or ($statut === 'prop' and $type === 'article' and $GLOBALS['meta']['post_dates'] === 'non') + || $statut === 'prop' && $type === 'article' && $GLOBALS['meta']['post_dates'] === 'non' ) { return autoriser('modifier', $type, $id); } @@ -625,7 +613,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_instituer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('modifier', $type, $id, $qui, $opt); } @@ -643,14 +631,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_publierdans_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - ($qui['statut'] === '0minirezo') - and ( - !$qui['restreint'] or !$id - or in_array($id, $qui['restreint']) - ); + return $qui['statut'] === '0minirezo' && (!$qui['restreint'] || !$id || in_array($id, $qui['restreint'])); } /** @@ -666,12 +649,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_creer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { if (!empty($opt['id_parent'])) { return autoriser('creerrubriquedans', 'rubrique', $opt['id_parent'], $qui); - } - else { + } else { return autoriser('defaut', null, 0, $qui, $opt); } } @@ -689,12 +671,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_creerrubriquedans_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - ($id or ($qui['statut'] === '0minirezo' and !$qui['restreint'])) - and autoriser('voir', 'rubrique', $id) - and autoriser('publierdans', 'rubrique', $id); + return ($id || $qui['statut'] === '0minirezo' && !$qui['restreint']) + && autoriser('voir', 'rubrique', $id) + && autoriser('publierdans', 'rubrique', $id); } /** @@ -710,15 +691,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_creerarticledans_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - $id - and autoriser('voir', 'rubrique', $id) - and autoriser('creer', 'article'); + return $id && autoriser('voir', 'rubrique', $id) && autoriser('creer', 'article'); } - /** * Autorisation de modifier une rubrique $id * @@ -732,10 +709,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_modifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - autoriser('publierdans', 'rubrique', $id, $qui, $opt); + return autoriser('publierdans', 'rubrique', $id, $qui, $opt); } /** @@ -751,7 +727,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_supprimer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { if (!$id = intval($id)) { return false; @@ -778,7 +754,6 @@ return autoriser('modifier', 'rubrique', $id); } - /** * Autorisation de modifier un article $id * @@ -793,7 +768,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_article_modifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { if (!$id) { return false; @@ -801,17 +776,11 @@ $r = sql_fetsel('id_rubrique,statut', 'spip_articles', 'id_article=' . sql_quote($id)); return - $r - and - ( - autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt) - or ( - (!isset($opt['statut']) or !in_array($opt['statut'], ['publie', 'refuse'], true)) - and in_array($qui['statut'], ['0minirezo', '1comite']) - and in_array($r['statut'], ['prop', 'prepa', 'poubelle']) - and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']) - ) - ); + $r && (autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt) + || (!isset($opt['statut']) || !in_array($opt['statut'], ['publie', 'refuse'], true)) + && in_array($qui['statut'], ['0minirezo', '1comite']) + && in_array($r['statut'], ['prop', 'prepa', 'poubelle']) + && auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])); } /** @@ -827,14 +796,13 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_article_creer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { if (!empty($opt['id_parent'])) { // creerarticledans rappelle autoriser(creer,article) sans id, donc on verifiera condition du else aussi return autoriser('creerarticledans', 'rubrique', $opt['id_parent'], $qui); - } - else { - return (sql_countsel('spip_rubriques') > 0 and in_array($qui['statut'], ['0minirezo', '1comite'])); + } else { + return sql_countsel('spip_rubriques') > 0 && in_array($qui['statut'], ['0minirezo', '1comite']); } } @@ -874,14 +842,9 @@ // si on est pas auteur de l'article, // seuls les propose et publies sont visibles in_array($statut, ['prop', 'publie']) - // sinon si on est auteur, on a le droit de le voir, evidemment ! - or - ($id - and $qui['id_auteur'] - and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])); + || $id && $qui['id_auteur'] && auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']); } - /** * Autorisation de voir un objet * @@ -895,12 +858,12 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_voir_dist(string $faire, string $type, $id, array $qui, array $opt): bool { # securite, mais on aurait pas du arriver ici ! if ( function_exists($f = 'autoriser_' . $type . '_voir') - or function_exists($f = 'autoriser_' . $type . '_voir_dist') + || function_exists($f = 'autoriser_' . $type . '_voir_dist') ) { return $f($faire, $type, $id, $qui, $opt); } @@ -917,7 +880,6 @@ return true; } - /** * Autorisation de webmestre * @@ -935,14 +897,13 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_webmestre_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - (defined('_ID_WEBMESTRES') ? - in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES)) + return (defined('_ID_WEBMESTRES') + ? in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES)) : $qui['webmestre'] === 'oui') - and $qui['statut'] === '0minirezo' - and !$qui['restreint']; + && $qui['statut'] === '0minirezo' + && !$qui['restreint']; } /** @@ -958,11 +919,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - $qui['statut'] === '0minirezo' - and !$qui['restreint']; + return $qui['statut'] === '0minirezo' && !$qui['restreint']; } /** @@ -978,10 +937,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_sauvegarder_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return - $qui['statut'] === '0minirezo'; + return $qui['statut'] === '0minirezo'; } /** @@ -997,7 +955,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_detruire_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('webmestre', null, 0, $qui, $opt); } @@ -1016,15 +974,15 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteur_previsualiser_dist(string $faire, string $type, $id, array $qui, array $opt): bool { // les admins peuvent "previsualiser" une page auteur if ( - $qui['statut'] === '0minirezo' - and !$qui['restreint'] + $qui['statut'] === '0minirezo' && !$qui['restreint'] ) { return true; - } elseif ($id === 0) { + } + if ($id === 0) { return false; } // "Voir en ligne" si l'auteur a un article publie @@ -1037,7 +995,6 @@ return $n ? true : false; } - /** * Autorisation de créer un auteur * @@ -1061,12 +1018,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteur_creer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return ($qui['statut'] === '0minirezo'); + return $qui['statut'] === '0minirezo'; } - /** * Autorisation de modifier un auteur * @@ -1082,7 +1038,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteur_modifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { $id = intval($id); @@ -1104,16 +1060,17 @@ // Un admin restreint peut modifier/creer un auteur non-admin mais il // n'a le droit ni de le promouvoir admin, ni de changer les rubriques if ($qui['restreint']) { - if (isset($opt['webmestre']) and $opt['webmestre']) { + if (isset($opt['webmestre']) && $opt['webmestre']) { return false; - } elseif ( - (isset($opt['statut']) and ($opt['statut'] === '0minirezo')) - or (isset($opt['restreintes']) and $opt['restreintes']) + } + if ( + isset($opt['statut']) && $opt['statut'] === '0minirezo' + || isset($opt['restreintes']) && $opt['restreintes'] ) { return false; } else { if ($id == $qui['id_auteur']) { - if (isset($opt['statut']) and $opt['statut']) { + if (isset($opt['statut']) && $opt['statut']) { return false; } else { return true; @@ -1121,7 +1078,7 @@ } else { if ($id_auteur = intval($id)) { $t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur"); - if ($t and $t['statut'] != '0minirezo') { + if ($t && $t['statut'] != '0minirezo') { return true; } else { return false; @@ -1136,26 +1093,33 @@ // Un admin complet fait ce qu'il veut // sauf se degrader - if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) { + if ($id == $qui['id_auteur'] + && ( + !empty($opt['statut']) + || !empty($opt['webmestre']) + || !empty($opt['restreintes']) + ) + ) { return false; - } elseif ( + } + + if ( isset($opt['webmestre']) - and $opt['webmestre'] - and (defined('_ID_WEBMESTRES') - or !autoriser('webmestre')) + && $opt['webmestre'] + && (defined('_ID_WEBMESTRES') || !autoriser('webmestre')) ) { // et toucher au statut webmestre si il ne l'est pas lui meme // ou si les webmestres sont fixes par constante (securite) return false; - } // et modifier un webmestre si il ne l'est pas lui meme - elseif (intval($id) and !autoriser('webmestre') and autoriser('webmestre', '', 0, $id)) { + } + // et modifier un webmestre si il ne l'est pas lui meme + if (intval($id) && !autoriser('webmestre') && autoriser('webmestre', '', 0, $id)) { return false; } else { return true; } } - /** * Autorisation d'associer un auteur sur un objet * @@ -1169,12 +1133,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_associerauteurs_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('modifier', $type, $id, $qui, $opt); } - /** * Autorisation d'upload FTP * @@ -1188,7 +1151,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_chargerftp_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return $qui['statut'] === '0minirezo'; } @@ -1206,7 +1169,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_debug_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return $qui['statut'] === '0minirezo'; } @@ -1223,7 +1186,7 @@ * @param int $id_auteur Identifiant de l'auteur * @param bool $raz Recalculer le résultat connu pour cet auteur * @return array Liste des rubriques - **/ + */ function liste_rubriques_auteur($id_auteur, $raz = false) { static $restreint = []; @@ -1238,14 +1201,9 @@ $rubriques = []; if ( - (!isset($GLOBALS['meta']['version_installee']) - or $GLOBALS['meta']['version_installee'] > 16428) - and $r = sql_allfetsel( - 'id_objet', - 'spip_auteurs_liens', - 'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0" - ) - and is_countable($r) ? count($r) : 0 + (!isset($GLOBALS['meta']['version_installee']) || $GLOBALS['meta']['version_installee'] > 16428) + && ($r = sql_allfetsel('id_objet', 'spip_auteurs_liens', 'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0")) + && (is_countable($r) ? count($r) : 0) ) { $r = array_column($r, 'id_objet'); @@ -1265,13 +1223,11 @@ // Affecter l'auteur session le cas echeant if ( - isset($GLOBALS['visiteur_session']['id_auteur']) - and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur + isset($GLOBALS['visiteur_session']['id_auteur']) && $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur ) { $GLOBALS['visiteur_session']['restreint'] = $rubriques; } - return $restreint[$id_auteur] = $rubriques; } @@ -1288,7 +1244,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_previsualiser_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('previsualiser'); } @@ -1306,7 +1262,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubrique_iconifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('publierdans', 'rubrique', $id, $qui, $opt); } @@ -1324,11 +1280,10 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteur_iconifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { $id = intval($id); - return (($id == $qui['id_auteur']) or - (($qui['statut'] === '0minirezo') and !$qui['restreint'])); + return $id == $qui['id_auteur'] || $qui['statut'] === '0minirezo' && !$qui['restreint']; } /** @@ -1344,13 +1299,12 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_iconifier_dist(string $faire, string $type, $id, array $qui, array $opt): bool { // par defaut, on a le droit d'iconifier si on a le droit de modifier return autoriser('modifier', $type, $id, $qui, $opt); } - /** * Autorisation OK * @@ -1365,7 +1319,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_ok_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1384,7 +1338,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return false - **/ + */ function autoriser_niet_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return false; } @@ -1402,9 +1356,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_base_reparer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - if (!autoriser('detruire') or _request('reinstall')) { + if (!autoriser('detruire') || _request('reinstall')) { return false; } @@ -1424,7 +1378,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_infosperso_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1442,7 +1396,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_langage_configurer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1460,7 +1414,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurerlangage_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_langage', $id, $qui, $opt); } @@ -1478,7 +1432,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_preferences_configurer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1514,7 +1468,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurerpreferences_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_preferences', $id, $qui, $opt); } @@ -1532,10 +1486,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_menudeveloppement_menugrandeentree_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev']) - and $GLOBALS['visiteur_session']['prefs']['activer_menudev'] === 'oui'); + return isset($GLOBALS['visiteur_session']['prefs']['activer_menudev']) && $GLOBALS['visiteur_session']['prefs']['activer_menudev'] === 'oui'; } /** @@ -1552,7 +1505,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_menugrandeentree_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1570,7 +1523,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_auteurs_voir_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1604,7 +1557,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteurs_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('voir', '_auteurs', $id, $qui, $opt); } @@ -1622,7 +1575,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_articles_voir_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1640,7 +1593,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_articles_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('voir', '_articles', $id, $qui, $opt); } @@ -1658,7 +1611,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return true - **/ + */ function autoriser_rubriques_voir_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return true; } @@ -1676,7 +1629,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_rubriques_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('voir', '_rubriques', $id, $qui, $opt); } @@ -1694,12 +1647,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_articlecreer_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return verifier_table_non_vide(); } - /** * Autorisation de voir le menu auteurcreer * @@ -1715,7 +1667,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_auteurcreer_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('creer', 'auteur', $id, $qui, $opt); } @@ -1733,15 +1685,12 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_visiteurs_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { include_spip('base/abstract_sql'); - return - $qui['statut'] === '0minirezo' and !$qui['restreint'] - and ( - $GLOBALS['meta']['accepter_visiteurs'] != 'non' - or sql_countsel('spip_auteurs', 'statut in ("6forum", "nouveau")') > 0 - ); + return $qui['statut'] === '0minirezo' + && !$qui['restreint'] + && ($GLOBALS['meta']['accepter_visiteurs'] != 'non' || sql_countsel('spip_auteurs', 'statut in ("6forum", "nouveau")') > 0); } /** @@ -1757,7 +1706,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_suiviedito_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return $qui['statut'] === '0minirezo'; } @@ -1775,7 +1724,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_synchro_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return $qui['statut'] === '0minirezo'; } @@ -1793,7 +1742,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurerinteractions_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_interactions', $id, $qui, $opt); } @@ -1811,7 +1760,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurerlangue_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_langue', $id, $qui, $opt); } @@ -1829,7 +1778,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurermultilinguisme_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_multilinguisme', $id, $qui, $opt); } @@ -1847,7 +1796,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configurercontenu_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_contenu', $id, $qui, $opt); } @@ -1865,7 +1814,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_configureravancees_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_avancees', $id, $qui, $opt); } @@ -1883,7 +1832,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_adminplugin_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('configurer', '_plugins', $id, $qui, $opt); } @@ -1901,7 +1850,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_admintech_menu_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('detruire', $type, $id, $qui, $opt); } @@ -1919,12 +1868,11 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_queue_purger_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('webmestre'); } - /** * Autorisation l'échafaudage de squelettes en Z * @@ -1939,7 +1887,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_echafauder_dist(string $faire, string $type, $id, array $qui, array $opt): bool { if (test_espace_prive()) { return intval($qui['id_auteur']) ? true : false; @@ -1948,7 +1896,6 @@ } } - /** * Retourne les identifiants d'auteurs liés à un objet * @@ -1963,7 +1910,7 @@ $objet = objet_type($objet); $where = [ 'objet=' . sql_quote($objet), - 'id_objet=' . intval($id_objet) + 'id_objet=' . intval($id_objet), ]; if (!empty($cond)) { if (is_array($cond)) { @@ -2003,7 +1950,6 @@ ); } - /** * Tester si on est admin restreint sur une rubrique donnée * @@ -2014,10 +1960,9 @@ */ function acces_restreint_rubrique($id_rubrique) { - return (isset($GLOBALS['connect_id_rubrique'][$id_rubrique])); + return isset($GLOBALS['connect_id_rubrique'][$id_rubrique]); } - /** * Verifier qu'il existe au moins un parent * @@ -2028,9 +1973,7 @@ */ function verifier_table_non_vide($table = 'spip_rubriques') { static $done = []; - if (!isset($done[$table])) { - $done[$table] = sql_countsel($table) > 0; - } + $done[$table] ??= sql_countsel($table) > 0; return $done[$table]; } @@ -2051,7 +1994,6 @@ * @see autoriser() * * @param string $faire Action demandée - * @param string $type Type d'objet ou élément * @param int|string|null $id Identifiant * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation @@ -2062,9 +2004,9 @@ $s = array_search($quoi, $GLOBALS['liste_des_statuts']); switch ($s) { case 'info_redacteurs': - return ($GLOBALS['meta']['accepter_inscriptions'] === 'oui'); + return $GLOBALS['meta']['accepter_inscriptions'] === 'oui'; case 'info_visiteurs': - return ($GLOBALS['meta']['accepter_visiteurs'] === 'oui' or $GLOBALS['meta']['forums_publics'] === 'abo'); + return $GLOBALS['meta']['accepter_visiteurs'] === 'oui' || $GLOBALS['meta']['forums_publics'] === 'abo'; } return false; @@ -2083,9 +2025,9 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_inscription_relancer_dist(string $faire, string $type, $id, array $qui, array $opt): bool { - return $qui['statut'] === '0minirezo' and !$qui['restreint']; + return $qui['statut'] === '0minirezo' && !$qui['restreint']; } /** @@ -2101,7 +2043,7 @@ * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon - **/ + */ function autoriser_phpinfos_dist(string $faire, string $type, $id, array $qui, array $opt): bool { return autoriser('webmestre'); } diff -Nru spip-4.4.23+dfsg/ecrire/inc/bandeau.php spip-4.4.28+dfsg/ecrire/inc/bandeau.php --- spip-4.4.23+dfsg/ecrire/inc/bandeau.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/bandeau.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ $contexte]) + || !($parent = $infos['parent']) + || !$autorise + || autoriser('menu', "_$id", 0, null, ['contexte' => $contexte]) ) { if ( $parent - and $parent = preg_replace(',^bando_,', 'menu_', $parent) - and isset($boutons_admin[$parent]) + && ($parent = preg_replace(',^bando_,', 'menu_', $parent)) + && isset($boutons_admin[$parent]) ) { - $position = (isset($infos['position']) and strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu); + $position = (isset($infos['position']) && strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu); if ($position < 0) { $position = count($boutons_admin[$parent]->sousmenu) + 1 + $position; } $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position) + [ $id => new Bouton( - ($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '', // icone + ($icones && !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '', // icone $infos['titre'], // titre - (isset($infos['action']) and $infos['action']) ? $infos['action'] : null, - (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null - ) + (isset($infos['action']) && $infos['action']) ? $infos['action'] : null, + (isset($infos['parametres']) && $infos['parametres']) ? $infos['parametres'] : null + ), ] + array_slice($boutons_admin[$parent]->sousmenu, $position, 100); } if ( !$parent - // provisoire, eviter les vieux boutons - and (!in_array($id, ['forum', 'statistiques_visites'])) - and (!$autorise or autoriser('menugrandeentree', "_$id", 0, null, ['contexte' => $contexte])) + && !in_array($id, ['forum', 'statistiques_visites']) + && (!$autorise || autoriser('menugrandeentree', "_$id", 0, null, ['contexte' => $contexte])) ) { - $position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin); + $position = (isset($infos['position']) && $infos['position']) ? $infos['position'] : count($boutons_admin); $boutons_admin = array_slice($boutons_admin, 0, $position) + [ $id => new Bouton( - ($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '', // icone + ($icones && isset($infos['icone']) && $infos['icone']) ? find_in_theme($infos['icone']) : '', // icone $infos['titre'], // titre - (isset($infos['action']) and $infos['action']) ? $infos['action'] : null, - (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null - ) + (isset($infos['action']) && $infos['action']) ? $infos['action'] : null, + (isset($infos['parametres']) && $infos['parametres']) ? $infos['parametres'] : null + ), ] + array_slice($boutons_admin, $position, 100); } @@ -151,9 +147,9 @@ 'args' => [ 'contexte' => $contexte, 'icones' => $icones, - 'autorise' => $autorise + 'autorise' => $autorise, ], - 'data' => $boutons_admin + 'data' => $boutons_admin, ] ); @@ -215,7 +211,6 @@ return trier_boutons_enfants_par_alpha($menus, true); } - /** * Créer l'URL à partir de exec et args, sauf si c'est déjà une url formatée * @@ -232,7 +227,7 @@ // @machin@ etant remplace par _request('machin') $url = str_replace('&', '&', $url); while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) { - if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) { + if ($matches[2] == 'id_secteur' && !isset($contexte['id_secteur']) && isset($contexte['id_rubrique'])) { $contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique'])); } $val = _request($matches[2], $contexte); @@ -254,7 +249,6 @@ return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET); } - /** * Retourne la liste des noms d'entrées de menus favoris de l'auteur connecté * @return array @@ -262,8 +256,8 @@ function obtenir_menus_favoris() { if ( isset($GLOBALS['visiteur_session']['prefs']['menus_favoris']) - and is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris']) - and $GLOBALS['visiteur_session']['prefs']['menus_favoris'] + && is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris']) + && $GLOBALS['visiteur_session']['prefs']['menus_favoris'] ) { return $GLOBALS['visiteur_session']['prefs']['menus_favoris']; } diff -Nru spip-4.4.23+dfsg/ecrire/inc/boutons.php spip-4.4.28+dfsg/ecrire/inc/boutons.php --- spip-4.4.23+dfsg/ecrire/inc/boutons.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/boutons.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,22 +1,19 @@ $infos) { if ( ($parent = $infos['parent']) @@ -55,7 +51,7 @@ (!empty($infos['action'])) ? generer_url_ecrire( $infos['action'], - (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : '' + (isset($infos['parametres']) && $infos['parametres']) ? $infos['parametres'] : '' ) : null ); @@ -66,7 +62,6 @@ } /** - * * Création de la barre d'onglets * * @uses definir_barre_onglets() diff -Nru spip-4.4.23+dfsg/ecrire/inc/charsets.php spip-4.4.28+dfsg/ecrire/inc/charsets.php --- spip-4.4.23+dfsg/ecrire/inc/charsets.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/charsets.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,13 +1,13 @@ 127 and !isset($vu[$reg[0]])) { + if ($reg[1] > 127 && !isset($vu[$reg[0]])) { $vu[$reg[0]] = caractere_utf_8($reg[1]); } } } - //$texte = str_replace(array_keys($vu), array_values($vu), $texte); + // $texte = str_replace(array_keys($vu), array_values($vu), $texte); // 2. Entites > ÿ - //$vu = array(); + // $vu = array(); if ( preg_match_all( ',�*([1-9a-f][0-9a-f][0-9a-f]+);,iS', @@ -719,9 +708,7 @@ ) ) { foreach ($regs as $reg) { - if (!isset($vu[$reg[0]])) { - $vu[$reg[0]] = caractere_utf_8(hexdec($reg[1])); - } + $vu[$reg[0]] ??= caractere_utf_8(hexdec($reg[1])); } } @@ -735,10 +722,10 @@ * texte à convertir * @return string * texte converti - **/ + */ function unicode_to_javascript($texte) { $vu = []; - while (preg_match(',�*([0-9]+);,S', $texte, $regs) and !isset($vu[$regs[1]])) { + while (preg_match(',�*([0-9]+);,S', $texte, $regs) && !isset($vu[$regs[1]])) { $num = $regs[1]; $vu[$num] = true; $s = '\u' . sprintf('%04x', $num); @@ -755,7 +742,7 @@ * texte à convertir * @return string * texte converti - **/ + */ function javascript_to_unicode($texte) { while (preg_match(',%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),', $texte, $regs)) { $texte = str_replace($regs[0], '&#' . hexdec($regs[1]) . ';', $texte); @@ -771,7 +758,7 @@ * texte à convertir * @return string * texte converti - **/ + */ function javascript_to_binary($texte) { while (preg_match(',%([0-9A-F][0-9A-F]),', $texte, $regs)) { $texte = str_replace($regs[0], chr(hexdec($regs[1])), $texte); @@ -780,7 +767,6 @@ return $texte; } - /** * Substition rapide de chaque graphème selon le charset sélectionné. * @@ -792,7 +778,6 @@ * @param string $texte * @param string $charset * @param string $complexe - * @return string */ function translitteration_rapide($texte, $charset = 'AUTO', $complexe = ''): string { static $trans = []; @@ -834,7 +819,6 @@ * @param string $texte * @param string $charset * @param string $complexe - * @return string */ function translitteration($texte, $charset = 'AUTO', $complexe = ''): string { if ($texte === null || $texte === '') { @@ -859,7 +843,6 @@ * @uses translitteration() * @param string $texte * @param bool $chiffres - * @return string */ function translitteration_complexe($texte, $chiffres = false): string { $texte = translitteration($texte, 'AUTO', 'complexe'); @@ -867,7 +850,7 @@ if ($chiffres) { $texte = preg_replace_callback( "/[aeiuoyd]['`?~.^+(-]{1,2}/S", - fn($m) => translitteration_chiffree($m[0]), + fn ($m) => translitteration_chiffree($m[0]), $texte ); } @@ -881,13 +864,11 @@ * Remplace des caractères dans une chaîne par des chiffres * * @param string $car - * @return string */ function translitteration_chiffree($car): string { return strtr($car, "'`?~.^+(-", '123456789'); } - /** * Reconnaitre le BOM utf-8 (0xEFBBBF) * @@ -895,9 +876,9 @@ * texte dont on vérifie la présence du BOM * @return bool * true s'il a un BOM - **/ + */ function bom_utf8($texte): bool { - return (substr($texte, 0, 3) === chr(0xEF) . chr(0xBB) . chr(0xBF)); + return substr($texte, 0, 3) === chr(0xEF) . chr(0xBB) . chr(0xBF); } /** @@ -912,7 +893,7 @@ * texte dont on vérifie qu'il est de l'utf-8 * @return bool * true si c'est le cas - **/ + */ function is_utf8($string): bool { return !strlen( preg_replace( @@ -938,7 +919,7 @@ * texte dont on vérifie qu'il est de l'ascii * @return bool * true si c'est le cas - **/ + */ function is_ascii($string): bool { return !strlen( preg_replace( @@ -962,12 +943,12 @@ * Éventuels headers HTTP liés à cette page * @return string * texte transcodé dans le charset du site - **/ + */ function transcoder_page($texte, $headers = ''): string { // Si tout est < 128 pas la peine d'aller plus loin if (is_ascii($texte)) { - #spip_log('charset: ascii'); + # spip_log('charset: ascii'); return $texte; } @@ -982,8 +963,8 @@ // charset precise par le contenu (html) preg_match(',<(meta|html|body)[^>]*charset[^>]*=[^>]*([#-_a-z0-9]+?),UimsS', $texte, $regs) # eviter toute balise SPIP tel que #CHARSET ou #CONFIG d'un squelette - and !str_contains($regs[2], '#') - and $tmp = trim(strtolower($regs[2])) + && !str_contains($regs[2], '#') + && ($tmp = trim(strtolower($regs[2]))) ) { $charset = $tmp; } elseif (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) { @@ -993,7 +974,6 @@ $charset = ''; } - // normaliser les noms du shif-jis japonais if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) { $charset = 'shift-jis'; @@ -1014,7 +994,6 @@ return importer_charset($texte, $charset); } - // // Gerer les outils mb_string // @@ -1024,8 +1003,8 @@ * * Coupe une chaîne en utilisant les outils mb* lorsque le site est en utf8 * - * @link http://fr.php.net/manual/fr/function.mb-substr.php - * @link http://www.php.net/manual/fr/function.substr.php + * @see http://fr.php.net/manual/fr/function.mb-substr.php + * @see http://www.php.net/manual/fr/function.substr.php * @uses spip_substr_manuelle() si les fonctions php mb sont absentes * * @param string $c Le texte @@ -1033,7 +1012,7 @@ * @param null|int $length Longueur ou fin * @return string * Le texte coupé - **/ + */ function spip_substr($c, $start = 0, $length = null) { if ($GLOBALS['meta']['charset'] !== 'utf-8') { if ($length) { diff -Nru spip-4.4.23+dfsg/ecrire/inc/chercher_logo.php spip-4.4.28+dfsg/ecrire/inc/chercher_logo.php --- spip-4.4.23+dfsg/ecrire/inc/chercher_logo.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/chercher_logo.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,19 +1,17 @@ 0 - and $root == $exclus + $exclus > 0 && $root == $exclus ) { return ''; } @@ -143,9 +139,9 @@ // creer l'' . "\n"; + $r = "$espace" + . $data[$root] + . '' . "\n"; } else { $r = ''; } @@ -168,7 +164,7 @@ } // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques - if ($restreint and $root != $id_rubrique and !autoriser('publierdans', 'rubrique', $root)) { + if ($restreint && $root != $id_rubrique && !autoriser('publierdans', 'rubrique', $root)) { return $sous; } @@ -192,17 +188,17 @@ * En mode rubrique, identifiant de soi-même * @return string * Code HTML du sélecteur - **/ + */ function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) { $enfants = []; $data = []; - if ($type == 'rubrique' and autoriser('publierdans', 'rubrique', 0)) { + if ($type == 'rubrique' && autoriser('publierdans', 'rubrique', 0)) { $data[0] = _T('info_racine_site'); } # premier choix = neant # si auteur (rubriques restreintes) # ou si creation avec id_rubrique=0 - elseif ($type == 'auteur' or !$id_rubrique) { + elseif ($type == 'auteur' || !$id_rubrique) { $data[0] = ' '; } @@ -224,7 +220,7 @@ $titre = couper(supprimer_tags(typo($r['titre'])) . ' ', 50); if ( $GLOBALS['meta']['multi_rubriques'] == 'oui' - and ($r['langue_choisie'] == 'oui' or $r['id_parent'] == 0) + && ($r['langue_choisie'] == 'oui' || $r['id_parent'] == 0) ) { $titre .= ' [' . traduire_nom_langue($r['lang']) . ']'; } @@ -241,14 +237,13 @@ // sauf si le selecteur s'adresse a une rubrique puisque on peut la mettre a la racine dans ce cas if ( count($data) == 2 - and isset($data[0]) - and !in_array($type, ['auteur', 'rubrique']) - and !$id_rubrique + && isset($data[0]) + && !in_array($type, ['auteur', 'rubrique']) + && !$id_rubrique ) { unset($data[0]); } - $opt = sous_menu_rubriques($id_rubrique, 0, 0, $data, $enfants, $idem, $restreint, $type); $att = " id='id_parent' name='id_parent'\nclass='selecteur_parent verdana1'"; @@ -259,8 +254,8 @@ } # message pour neuneus (a supprimer ?) -# if ($type != 'auteur' AND $type != 'breve') -# $r .= "\n
    "._T('texte_rappel_selection_champs'); + # if ($type != 'auteur' AND $type != 'breve') + # $r .= "\n
    "._T('texte_rappel_selection_champs'); return $r; } @@ -314,7 +309,6 @@ . ($restreint ? '' : '&racine=oui') . (isset($GLOBALS['var_profile']) ? '&var_profile=1' : '')); - return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique); } @@ -343,9 +337,9 @@ * Valeur actuelle du champ * @return string * Code HTML du sélecteur de rubrique AJAX - **/ + */ function construire_selecteur($url, $js, $idom, $name, $init = '', $id = 0) { - $icone = (strpos($idom, 'auteur') !== false) ? 'auteur-24.png' : 'rechercher-20.png'; + $icone = (str_contains($idom, 'auteur')) ? 'auteur-24.png' : 'rechercher-20.png'; // si icone de recherche on embed le svg $balise = ($icone === 'rechercher-20.png' ? chercher_filtre('balise_svg') : chercher_filtre('balise_img')); $img_icone = $balise(chemin_image($icone), _T('titre_image_selecteur')); diff -Nru spip-4.4.23+dfsg/ecrire/inc/commencer_page.php spip-4.4.28+dfsg/ecrire/inc/commencer_page.php --- spip-4.4.23+dfsg/ecrire/inc/commencer_page.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/commencer_page.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ $titre, 'minipres' => $minipres ? ' ' : '']); + return recuperer_fond('prive/squelettes/head/dist', [ + 'titre' => $titre, + 'minipres' => $minipres ? ' ' : '', + ]); } /** @@ -125,7 +125,7 @@ * * @param string $rubrique * @param string $sous_rubrique - * @param integer $id_rubrique + * @param int $id_rubrique * @param bool $menu * @return string */ @@ -140,7 +140,6 @@ return $res; } - $bandeau = charger_fonction('bandeau', 'inc'); return $res @@ -165,11 +164,10 @@ return spip_sanitize_classname($classes); } - /** * Afficher la liste des auteurs connectés à l'espace privé * - * @param integer $id_auteur + * @param int $id_auteur * @return string */ function auteurs_recemment_connectes($id_auteur) { diff -Nru spip-4.4.23+dfsg/ecrire/inc/completer_traduction.php spip-4.4.28+dfsg/ecrire/inc/completer_traduction.php --- spip-4.4.23+dfsg/ecrire/inc/completer_traduction.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/completer_traduction.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,20 +1,17 @@ 1) { + if (!reset($cfg) && count($cfg) > 1) { array_shift($cfg); $table = array_shift($cfg); if (!isset($GLOBALS[$table])) { @@ -92,7 +86,7 @@ * Clé de configuration * @param mixed $def * Valeur par défaut - * @param boolean $unserialize + * @param bool $unserialize * N'affecte que le dépôt 'meta' : * True pour désérialiser automatiquement la valeur * @return mixed @@ -105,21 +99,21 @@ // traiter en priorite le cas simple et frequent // de lecture direct $GLOBALS['meta']['truc'], si $cfg ne contient ni / ni : - if ($cfg and strpbrk($cfg, '/:') === false) { + if ($cfg && strpbrk($cfg, '/:') === false) { $r = isset($GLOBALS['meta'][$cfg]) ? - ((!$unserialize - // ne pas essayer de deserialiser autre chose qu'une chaine - or !is_string($GLOBALS['meta'][$cfg]) - // ne pas essayer de deserialiser si ce n'est visiblement pas une chaine serializee - or !str_contains($GLOBALS['meta'][$cfg], ':') - or ($t = @unserialize($GLOBALS['meta'][$cfg])) === false) ? $GLOBALS['meta'][$cfg] : $t) + ((!$unserialize + // ne pas essayer de deserialiser autre chose qu'une chaine + || !is_string($GLOBALS['meta'][$cfg]) + // ne pas essayer de deserialiser si ce n'est visiblement pas une chaine serializee + || !str_contains($GLOBALS['meta'][$cfg], ':') + || ($t = @unserialize($GLOBALS['meta'][$cfg])) === false) ? $GLOBALS['meta'][$cfg] : $t) : $def; return $r; } // Brancher sur methodes externes si besoin - if ($cfg and $p = strpos($cfg, '::')) { + if ($cfg && $p = strpos($cfg, '::')) { $methode = substr($cfg, 0, $p); $lire_config = charger_fonction($methode, 'lire_config'); @@ -144,16 +138,16 @@ // ou si on a besoin // d'un sous casier $r = $r[$casier] ?? null; - if (($unserialize or is_countable($sous_casier) ? count($sous_casier) : 0) and $r and is_string($r)) { + if (($unserialize || (is_countable($sous_casier) ? count($sous_casier) : 0)) && $r && is_string($r)) { $r = (($t = @unserialize($r)) === false ? $r : $t); } // aller chercher le sous_casier - while (!is_null($r) and $casier = array_shift($sous_casier)) { + while ($r !== null && ($casier = array_shift($sous_casier))) { $r = $r[$casier] ?? null; } - if (is_null($r)) { + if ($r === null) { return $def; } @@ -174,7 +168,6 @@ return lire_config($cfg, $def, $unserialize); } - /** * Ecrire une configuration * @@ -184,7 +177,7 @@ */ function ecrire_config($cfg, $store) { // Brancher sur methodes externes si besoin - if ($cfg and $p = strpos($cfg, '::')) { + if ($cfg && ($p = strpos($cfg, '::'))) { $methode = substr($cfg, 0, $p); $ecrire_config = charger_fonction($methode, 'ecrire_config'); @@ -199,7 +192,7 @@ // trouvons ou creons le pointeur sur le casier $st = $GLOBALS[$table][$casier] ?? null; - if (!is_array($st) and ($sous_casier or is_array($store))) { + if (!is_array($st) && ($sous_casier || is_array($store))) { if ($st === null) { // ne rien creer si c'est une demande d'effacement if ($store === null) { @@ -224,12 +217,12 @@ if ($c = $sous_casier) { $sc = &$st; $pointeurs = []; - while (is_countable($c) ? count($c) : 0 and $cc = array_shift($c)) { + while ((is_countable($c) ? count($c) : 0) && $cc = array_shift($c)) { // creer l'entree si elle n'existe pas if (!isset($sc[$cc])) { // si on essaye d'effacer une config qui n'existe pas // ne rien creer mais sortir - if (is_null($store)) { + if ($store === null) { return false; } $sc[$cc] = []; @@ -239,7 +232,7 @@ } // si c'est une demande d'effacement - if (is_null($store)) { + if ($store === null) { $c = $sous_casier; $sous = array_pop($c); // effacer, et remonter pour effacer les parents vides @@ -250,16 +243,16 @@ // si on a vide tous les sous casiers, // et que le casier est vide // vider aussi la meta - if (!$sous and !(is_countable($st) ? count($st) : 0)) { + if (!$sous && !(is_countable($st) ? count($st) : 0)) { $st = null; } } // dans tous les autres cas, on ecrase else { if ( - defined('_MYSQL_NOPLANES') - and _MYSQL_NOPLANES - and !empty($GLOBALS['meta']['charset_sql_connexion']) - and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8' + defined('_MYSQL_NOPLANES') + && _MYSQL_NOPLANES + && !empty($GLOBALS['meta']['charset_sql_connexion']) + && $GLOBALS['meta']['charset_sql_connexion'] == 'utf8' ) { // detecter si la valeur qu'on veut ecrire a des planes // @see utf8_noplanes @@ -283,8 +276,8 @@ $store = $st; } - if (is_null($store)) { - if (is_null($st) and !$sous_casier) { + if ($store === null) { + if ($st === null && !$sous_casier) { return false; } // la config n'existait deja pas ! effacer_meta($casier, $table); @@ -313,8 +306,7 @@ ecrire_meta($casier, $serialized_store, null, $table); } } - } - else { + } else { ecrire_meta($casier, $store, null, $table); } } @@ -323,7 +315,6 @@ return true; } - /** * metapack est inclue dans ecrire_config, mais on traite le cas ou il est explicite * metapack:: dans le $cfg de ecrire_config. @@ -337,7 +328,7 @@ // cas particulier en metapack:: // si on ecrit une chaine deja serializee, il faut la reserializer pour la rendre // intacte en sortie ... - if (is_string($store) and strpos($store, ':') and unserialize($store)) { + if (is_string($store) && strpos($store, ':') && unserialize($store)) { $store = serialize($store); } @@ -429,7 +420,6 @@ * et recalcule les langues * * @param array $liste_meta - * @return void */ function actualise_metas($liste_meta) { $meta_serveur = @@ -455,7 +445,7 @@ 'formats_graphiques', 'image_process', 'plugin_header', - 'plugin' + 'plugin', ]; // verifier le impt=non sql_updateq('spip_meta', ['impt' => 'non'], sql_in('nom', $meta_serveur)); @@ -471,7 +461,6 @@ ecrire_meta('langues_utilisees', $langues); } - // // Gestion des modifs // @@ -486,7 +475,6 @@ * @uses purger_repertoire() * * @param bool $purger_skel - * @return void */ function appliquer_modifs_config($purger_skel = false) { diff -Nru spip-4.4.23+dfsg/ecrire/inc/cookie.php spip-4.4.28+dfsg/ecrire/inc/cookie.php --- spip-4.4.23+dfsg/ecrire/inc/cookie.php 2026-09-02 11:56:18.000000000 +0000 +++ spip-4.4.28+dfsg/ecrire/inc/cookie.php 2026-10-07 13:48:22.000000000 +0000 @@ -1,30 +1,26 @@ true`) */ - if (defined('_COOKIE_SECURE_LIST') and is_array(constant('_COOKIE_SECURE_LIST'))) { + if (defined('_COOKIE_SECURE_LIST') && is_array(constant('_COOKIE_SECURE_LIST'))) { $to_secure_list = array_merge($to_secure_list, constant('_COOKIE_SECURE_LIST')); } @@ -103,11 +99,11 @@ } // in fine renommer le prefixe si besoin - if (strpos($name, 'spip_') === 0) { + if (str_starts_with($name, 'spip_')) { $name = $GLOBALS['cookie_prefix'] . '_' . substr($name, 5); } - #spip_log("cookie('$name', '$value', " . json_encode($options, true) . ")", "cookies"); + # spip_log("cookie('$name', '$value', " . json_encode($options, true) . ")", "cookies"); $a = @setcookie($name, $value, $options); spip_cookie_envoye(true); @@ -126,7 +122,7 @@ * @param bool|string $set * true pour déclarer les cookies comme envoyés * @return bool - **/ + */ function spip_cookie_envoye($set = '') { static $envoye = false; if ($set) { @@ -150,7 +146,7 @@ * * @param string $cookie_prefix * Préfixe des cookies de SPIP - **/ + */ function recuperer_cookies_spip($cookie_prefix) { $cookie_prefix .= '_'; $prefix_long = strlen($cookie_prefix); @@ -168,7 +164,6 @@ } } - /** * Teste si javascript est supporté par le navigateur et pose un cookie en conséquence * @@ -181,8 +176,7 @@ * * @see html_tests_js() * @uses spip_setcookie() - * - **/ + */ function exec_test_ajax_dist() { switch (_request('js')) { // on est appele par