From c7482016ced5dbe970fb117a580af2e47122bcc5 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 7 Jul 2026 14:15:48 -0400 Subject: [PATCH] Implement superadmin login redirection and session handling improvements This commit introduces a new function, `fxSuperadmRedirectToLoginIfNeeded`, to streamline the login redirection process for superadmin users. It enhances session management by checking for user authentication and allowing legacy account access under specific conditions. Additionally, the login flow is updated to ensure users are redirected appropriately after login, improving the overall security and user experience in the superadmin interface. These changes aim to enhance maintainability and clarity in session handling across various superadmin pages. --- php/doc_edition.php | 4 + php/inc_fonctions_sl.php | 12 +++ php/sync_static_db.php | 4 + php/traduction.php | 4 + sql/MSIN-info-inventaire.sql | 28 ++++++ sql/MSIN-info-restore-diag-compare.sql | 85 +++++++++++++++++ sql/MSIN-info-restore-from-backup.sql | 88 ++++++++++++++++++ sql/MSIN-promoteur-hub-info-restore.sql | 117 ++++++++++++++++++++++++ superadm/documentation.php | 3 +- superadm/index.php | 4 +- superadm/login.php | 4 +- superadm/php/inc_functions.php | 47 ++++++++++ superadm/php/inc_start_time.php | 10 ++ superadm/rapport_new.php | 2 + 14 files changed, 408 insertions(+), 4 deletions(-) create mode 100644 sql/MSIN-info-inventaire.sql create mode 100644 sql/MSIN-info-restore-diag-compare.sql create mode 100644 sql/MSIN-info-restore-from-backup.sql create mode 100644 sql/MSIN-promoteur-hub-info-restore.sql diff --git a/php/doc_edition.php b/php/doc_edition.php index d6f55dc..7326688 100644 --- a/php/doc_edition.php +++ b/php/doc_edition.php @@ -8,6 +8,10 @@ require_once('inc_start_time.php'); require_once('inc_fonctions.php'); require_once('inc_fx_messages.php'); +if (empty($_SESSION['usa_id'])) { + fxAdminRequireSuperadmLogin(); +} + if (!fxAdminCanUseTextEditTools()) { header('HTTP/1.1 403 Forbidden'); echo 'Accès refusé.'; diff --git a/php/inc_fonctions_sl.php b/php/inc_fonctions_sl.php index 6a51829..8253bc0 100644 --- a/php/inc_fonctions_sl.php +++ b/php/inc_fonctions_sl.php @@ -168,6 +168,18 @@ function fxAdminCanUseTextEditTools() { return !empty($_SESSION['usa_id']) && fxAdminIsDevPreprod(); } +/** Outils admin /php/* sans usa_id → login superadm (pas « Accès refusé »). */ +function fxAdminRequireSuperadmLogin() { + if (!empty($_SESSION['usa_id'])) { + return; + } + + global $vDomaine; + $_SESSION['superadm_redirect_after_login'] = $_SERVER['REQUEST_URI']; + header('Location: ' . rtrim((string)$vDomaine, '/') . '/superadm/login.php'); + exit; +} + /** Sync tables statiques (sync_static_db.php) — superadm, préprod dev seulement. */ function fxAdminStaticSyncAllowed() { return !empty($_SESSION['usa_id']) && fxAdminIsDevPreprod(); diff --git a/php/sync_static_db.php b/php/sync_static_db.php index 47d793e..149ca85 100644 --- a/php/sync_static_db.php +++ b/php/sync_static_db.php @@ -10,6 +10,10 @@ require_once('inc_fonctions.php'); require_once('inc_fx_messages.php'); require_once('inc_fx_static_sync.php'); +if (empty($_SESSION['usa_id'])) { + fxAdminRequireSuperadmLogin(); +} + if (!fxAdminStaticSyncAllowed()) { header('HTTP/1.1 403 Forbidden'); echo 'Accès refusé.'; diff --git a/php/traduction.php b/php/traduction.php index 47c81e8..1237638 100644 --- a/php/traduction.php +++ b/php/traduction.php @@ -8,6 +8,10 @@ require_once('inc_start_time.php'); require_once('inc_fonctions.php'); require_once('inc_fx_messages.php'); +if (empty($_SESSION['usa_id'])) { + fxAdminRequireSuperadmLogin(); +} + if (!fxAdminCanUseTextEditTools()) { header('HTTP/1.1 403 Forbidden'); echo 'Accès refusé.'; diff --git a/sql/MSIN-info-inventaire.sql b/sql/MSIN-info-inventaire.sql new file mode 100644 index 0000000..c710cdb --- /dev/null +++ b/sql/MSIN-info-inventaire.sql @@ -0,0 +1,28 @@ +-- MSIN-info — Inventaire table info (exécuter sur CHAQUE base : backup d'avant sync, prod actuelle, dev) +-- Exporter les résultats (CSV) et comparer dans Navicat ou Excel. +-- Ne modifie rien. + +-- 1) Volume global +SELECT 'info_total' AS k, COUNT(*) AS v FROM info +UNION ALL +SELECT 'info_poubelle', COUNT(*) FROM info WHERE info_texte = info_clef +UNION ALL +SELECT 'info_promoteur_hub', COUNT(*) FROM info WHERE info_clef LIKE 'promoteur_hub_%'; + +-- 2) Clés hub promoteur (souvent les premières manquantes) +SELECT info_clef, info_langue, info_actif, + CASE WHEN info_texte = info_clef THEN 'POUBELLE' ELSE 'OK' END AS etat, + LEFT(info_texte, 80) AS extrait +FROM info +WHERE info_clef LIKE 'promoteur_hub_%' +ORDER BY info_clef, info_langue; + +-- 3) Lignes poubelle restantes (auto-créées par afficheTexte pendant fenêtre vide) +SELECT info_clef, info_langue, info_prg, info_texte +FROM info +WHERE info_texte = info_clef +ORDER BY info_prg, info_clef, info_langue +LIMIT 500; + +-- 4) Export complet pour diff externe (décommenter si besoin — peut être gros) +-- SELECT info_clef, info_langue, info_prg, info_texte, info_actif FROM info ORDER BY info_clef, info_langue, info_prg; diff --git a/sql/MSIN-info-restore-diag-compare.sql b/sql/MSIN-info-restore-diag-compare.sql new file mode 100644 index 0000000..9d84a8b --- /dev/null +++ b/sql/MSIN-info-restore-diag-compare.sql @@ -0,0 +1,85 @@ +-- MSIN-info — Diagnostic comparatif table info (cible vs backup) +-- Contexte : sync_static_db a écrasé / corrompu info ; clés brutes dans l'UI (info_texte = info_clef) +-- Prérequis : importer la backup sur le MÊME serveur MySQL sous un nom dédié (ex. devinscription_bak) +-- Notes prod : lecture seule — ne pas exécuter les DELETE/UPDATE du script restore sans validation +-- +-- 1) Remplacer les deux noms ci-dessous +-- 2) Exécuter section par section dans Navicat +-- 3) Exporter les SELECT « manquants / corrompus » en CSV si besoin + +SET NAMES utf8mb4; + +-- === CONFIG — modifier avant exécution === +SET @db_cible = 'devinscription_preprod'; +SET @db_backup = 'devinscription_bak'; -- backup d'avant incident sync / import prod + +-- === A) Volumes === +SELECT 'cible_total' AS metrique, COUNT(*) AS v FROM devinscription_preprod.info +UNION ALL SELECT 'backup_total', COUNT(*) FROM devinscription_bak.info +UNION ALL SELECT 'cible_poubelle', COUNT(*) FROM devinscription_preprod.info WHERE info_texte = info_clef +UNION ALL SELECT 'backup_poubelle', COUNT(*) FROM devinscription_bak.info WHERE info_texte = info_clef; + +-- === B) Lignes manquantes dans la cible (présentes en backup, absentes en cible) === +SELECT b.info_clef, b.info_langue, b.info_prg, + LEFT(b.info_texte, 100) AS texte_backup +FROM devinscription_bak.info b +LEFT JOIN devinscription_preprod.info c + ON c.info_clef = b.info_clef AND c.info_langue = b.info_langue AND c.info_prg = b.info_prg +WHERE c.pk_info IS NULL +ORDER BY b.info_prg, b.info_clef, b.info_langue; + +-- === C) Lignes corrompues en cible (poubelle auto-créée par afficheTexte) réparables depuis backup === +SELECT c.pk_info, c.info_clef, c.info_langue, c.info_prg, + c.info_texte AS texte_cible, + LEFT(b.info_texte, 100) AS texte_backup +FROM devinscription_preprod.info c +INNER JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +WHERE c.info_texte = c.info_clef + AND b.info_texte <> b.info_clef + AND TRIM(b.info_texte) <> '' +ORDER BY c.info_prg, c.info_clef, c.info_langue; + +-- === D) Texte différent (backup OK, cible pas poubelle) — revue manuelle avant UPDATE massif === +SELECT c.pk_info, c.info_clef, c.info_langue, c.info_prg, + LEFT(c.info_texte, 80) AS texte_cible, + LEFT(b.info_texte, 80) AS texte_backup +FROM devinscription_preprod.info c +INNER JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +WHERE c.info_texte <> b.info_texte + AND c.info_texte <> c.info_clef + AND b.info_texte <> b.info_clef +ORDER BY c.info_prg, c.info_clef, c.info_langue +LIMIT 500; + +-- === E) Poubelle en cible SANS équivalent backup (créées après incident — souvent supprimables) === +SELECT c.pk_info, c.info_clef, c.info_langue, c.info_prg, c.info_texte +FROM devinscription_preprod.info c +LEFT JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +WHERE c.info_texte = c.info_clef + AND b.pk_info IS NULL +ORDER BY c.info_creation DESC, c.info_prg, c.info_clef +LIMIT 500; + +-- === F) Modules les plus touchés (prioriser la relecture UI) === +SELECT c.info_prg, + SUM(c.info_texte = c.info_clef) AS nb_poubelle, + COUNT(*) AS nb_total +FROM devinscription_preprod.info c +GROUP BY c.info_prg +HAVING nb_poubelle > 0 +ORDER BY nb_poubelle DESC; + +-- === G) Clés inscr_gestion_* / promoteur_hub_* (capture écran typique) === +SELECT c.info_clef, c.info_langue, c.info_prg, + CASE WHEN c.info_texte = c.info_clef THEN 'POUBELLE' ELSE 'OK' END AS etat_cible, + CASE WHEN b.pk_info IS NULL THEN 'ABSENT_BACKUP' ELSE 'OK_BACKUP' END AS etat_backup, + LEFT(COALESCE(b.info_texte, c.info_texte), 80) AS extrait +FROM devinscription_preprod.info c +LEFT JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +WHERE c.info_clef LIKE 'inscr_gestion_%' + OR c.info_clef LIKE 'promoteur_hub_%' +ORDER BY c.info_clef, c.info_langue, c.info_prg; diff --git a/sql/MSIN-info-restore-from-backup.sql b/sql/MSIN-info-restore-from-backup.sql new file mode 100644 index 0000000..793b39f --- /dev/null +++ b/sql/MSIN-info-restore-from-backup.sql @@ -0,0 +1,88 @@ +-- MSIN-info — Restauration MASSIVE table info depuis backup (Navicat) +-- Contexte : après sync_static_db / import prod — clés brutes partout (info_texte = info_clef) +-- Prérequis : +-- 1) Backup d'avant incident importée sur le MÊME serveur (ex. devinscription_bak) +-- 2) Exécuter MSIN-info-restore-diag-compare.sql et valider les volumes +-- 3) FAIRE UN DUMP de devinscription_preprod.info AVANT ce script +-- Idempotent : INSERT manquants + UPDATE poubelles ; ne touche pas les textes déjà OK +-- Notes prod client : attendre blocage sync info ; même procédure avec backup prod pré-sync + +SET NAMES utf8mb4; + +-- === CONFIG — modifier avant exécution === +SET @db_cible = 'devinscription_preprod'; +SET @db_backup = 'devinscription_bak'; + +-- --------------------------------------------------------------------------- +-- Étape 1 — Insérer les lignes absentes en cible (clé = info_clef + info_langue + info_prg) +-- --------------------------------------------------------------------------- +INSERT INTO devinscription_preprod.info ( + info_clef, info_langue, info_texte, info_aide, info_prg, + info_description, info_trie, info_actif, + info_option1, info_option2, info_option3, info_creation +) +SELECT + b.info_clef, b.info_langue, b.info_texte, b.info_aide, b.info_prg, + b.info_description, b.info_trie, b.info_actif, + b.info_option1, b.info_option2, b.info_option3, NOW() +FROM devinscription_bak.info b +LEFT JOIN devinscription_preprod.info c + ON c.info_clef = b.info_clef AND c.info_langue = b.info_langue AND c.info_prg = b.info_prg +WHERE c.pk_info IS NULL; + +-- --------------------------------------------------------------------------- +-- Étape 2 — Réparer les poubelles (info_texte = info_clef) quand backup a un vrai libellé +-- --------------------------------------------------------------------------- +UPDATE devinscription_preprod.info c +INNER JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +SET + c.info_texte = b.info_texte, + c.info_aide = b.info_aide, + c.info_description = b.info_description, + c.info_trie = b.info_trie, + c.info_actif = b.info_actif, + c.info_option1 = b.info_option1, + c.info_option2 = b.info_option2, + c.info_option3 = b.info_option3, + c.info_maj = NOW() +WHERE c.info_texte = c.info_clef + AND b.info_texte <> b.info_clef + AND TRIM(b.info_texte) <> ''; + +-- --------------------------------------------------------------------------- +-- Étape 3 — Réparer texte vide en cible (backup non vide) +-- --------------------------------------------------------------------------- +UPDATE devinscription_preprod.info c +INNER JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +SET + c.info_texte = b.info_texte, + c.info_aide = b.info_aide, + c.info_maj = NOW() +WHERE TRIM(c.info_texte) = '' + AND TRIM(b.info_texte) <> '' + AND b.info_texte <> b.info_clef; + +-- --------------------------------------------------------------------------- +-- Étape 4 — Supprimer poubelles orphelines (absentes du backup, jamais traduites) +-- ATTENTION : exécuter seulement si section E du diag est cohérente +-- --------------------------------------------------------------------------- +DELETE c FROM devinscription_preprod.info c +LEFT JOIN devinscription_bak.info b + ON b.info_clef = c.info_clef AND b.info_langue = c.info_langue AND b.info_prg = c.info_prg +WHERE c.info_texte = c.info_clef + AND b.pk_info IS NULL; + +-- --------------------------------------------------------------------------- +-- Étape 5 — Vérification post-restore (doit tendre vers 0 poubelle) +-- --------------------------------------------------------------------------- +SELECT 'post_total' AS k, COUNT(*) AS v FROM devinscription_preprod.info +UNION ALL +SELECT 'post_poubelle', COUNT(*) FROM devinscription_preprod.info WHERE info_texte = info_clef +UNION ALL +SELECT 'post_manquants_vs_backup', COUNT(*) +FROM devinscription_bak.info b +LEFT JOIN devinscription_preprod.info c + ON c.info_clef = b.info_clef AND c.info_langue = b.info_langue AND c.info_prg = b.info_prg +WHERE c.pk_info IS NULL; diff --git a/sql/MSIN-promoteur-hub-info-restore.sql b/sql/MSIN-promoteur-hub-info-restore.sql new file mode 100644 index 0000000..a210b2f --- /dev/null +++ b/sql/MSIN-promoteur-hub-info-restore.sql @@ -0,0 +1,117 @@ +-- MSIN-promoteur-hub — Restaurer libellés hub (table info) +-- Contexte : clés promoteur_hub_* absentes ou info_texte = info_clef après sync / ménage +-- Idempotent : n'écrase pas une traduction déjà personnalisée (info_texte <> info_clef) +-- Prérequis : aucun. Exécuter sur dev préprod (serveur). + +SET NAMES utf8mb4; + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_intro', 'fr', 'Acces a vos tableaux de bord par evenement.', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_intro' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_intro', 'en', 'Access your event dashboards.', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_intro' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_link_participant', 'fr', 'Mon espace client MS1', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_link_participant' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_link_participant', 'en', 'My MS1 client space', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_link_participant' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_annonces_titre', 'fr', 'Nouveautes MS1', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_annonces_titre' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_annonces_titre', 'en', 'MS1 updates', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_annonces_titre' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_highlight', 'fr', 'En vedette', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_highlight' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_highlight', 'en', 'Highlights', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_highlight' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_archived', 'fr', 'Evenements passes', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_archived' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_archived', 'en', 'Past events', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_archived' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_gestion', 'fr', 'Gestion', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_gestion' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_section_gestion', 'en', 'Management', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_section_gestion' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_btn_tableau', 'fr', 'Tableau de bord', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_btn_tableau' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_btn_tableau', 'en', 'Dashboard', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_btn_tableau' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_btn_mobile', 'fr', 'Inscriptions mobile', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_btn_mobile' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_btn_mobile', 'en', 'Mobile registrations', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_btn_mobile' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_menu', 'fr', 'Mes evenements (promoteur)', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_menu' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_menu', 'en', 'My events (promoter)', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_menu' AND info_langue = 'en' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_empty', 'fr', 'Aucun evenement accessible pour le moment.', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_empty' AND info_langue = 'fr' AND info_prg = 'compte.php'); + +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) +SELECT 'promoteur_hub_empty', 'en', 'No accessible events at this time.', '', 'compte.php', '', 0, 1, '', '', '', NOW() +WHERE NOT EXISTS (SELECT 1 FROM info WHERE info_clef = 'promoteur_hub_empty' AND info_langue = 'en' AND info_prg = 'compte.php'); + +-- Lignes poubelle (auto-créées par afficheTexte) : remettre le libellé par défaut +UPDATE info SET info_texte = 'Acces a vos tableaux de bord par evenement.' +WHERE info_clef = 'promoteur_hub_intro' AND info_langue = 'fr' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Access your event dashboards.' +WHERE info_clef = 'promoteur_hub_intro' AND info_langue = 'en' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Mon espace client MS1' +WHERE info_clef = 'promoteur_hub_link_participant' AND info_langue = 'fr' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'My MS1 client space' +WHERE info_clef = 'promoteur_hub_link_participant' AND info_langue = 'en' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Nouveautes MS1' +WHERE info_clef = 'promoteur_hub_annonces_titre' AND info_langue = 'fr' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'MS1 updates' +WHERE info_clef = 'promoteur_hub_annonces_titre' AND info_langue = 'en' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'En vedette' +WHERE info_clef = 'promoteur_hub_section_highlight' AND info_langue = 'fr' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Highlights' +WHERE info_clef = 'promoteur_hub_section_highlight' AND info_langue = 'en' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Tableau de bord' +WHERE info_clef = 'promoteur_hub_btn_tableau' AND info_langue = 'fr' AND info_prg = 'compte.php' AND info_texte = info_clef; + +UPDATE info SET info_texte = 'Dashboard' +WHERE info_clef = 'promoteur_hub_btn_tableau' AND info_langue = 'en' AND info_prg = 'compte.php' AND info_texte = info_clef; diff --git a/superadm/documentation.php b/superadm/documentation.php index 6b06537..5dd005b 100644 --- a/superadm/documentation.php +++ b/superadm/documentation.php @@ -10,7 +10,8 @@ require_once('php/inc_fx_doc_admin.php'); global $objDatabase, $vDomaine, $vblnEnvironementDev, $vblnEnvironementPreProd; -$blnLogged = !empty($_SESSION['usa_id']); +fxSuperadmRedirectToLoginIfNeeded(false); +$blnLogged = fxSuperadmIsLoggedIn(); $strFlash = ''; $strError = ''; diff --git a/superadm/index.php b/superadm/index.php index 29bc971..027c48f 100644 --- a/superadm/index.php +++ b/superadm/index.php @@ -198,8 +198,10 @@ if (isset($_GET['action']) && $_GET['action'] == 'migrateveacceslegacyall') { require_once('php/inc_start_time.php'); if ($strAction != 'report') { - $blnLogged = fxSuperadmIsLoggedIn(); + fxSuperadmRedirectToLoginIfNeeded(false); + $blnLogged = true; } else { + fxSuperadmRedirectToLoginIfNeeded(true); $intMenu2 = base64_decode(urldecode($intMenu)); $blnLogged = fxSuperadmReportMenuAllowed(intval($intMenu2)); } diff --git a/superadm/login.php b/superadm/login.php index 1d732fb..436a02b 100644 --- a/superadm/login.php +++ b/superadm/login.php @@ -2,7 +2,7 @@ session_start(); if (!empty($_SESSION['usa_id'])) { - header('Location: index.php'); + header('Location: ' . fxSuperadmConsumeRedirectAfterLogin('index.php')); exit; } @@ -30,7 +30,7 @@ $qryUpdate = $db->fxQuery($sqlUpdate); */ $_SESSION['usa_info'] = $recLogin; $_SESSION['logged'] = time(); - header('Location: index.php'); + header('Location: ' . fxSuperadmConsumeRedirectAfterLogin('index.php')); exit; } else { $_SESSION['msg'] = 1; diff --git a/superadm/php/inc_functions.php b/superadm/php/inc_functions.php index 28a99c3..bdb5f9a 100644 --- a/superadm/php/inc_functions.php +++ b/superadm/php/inc_functions.php @@ -1325,6 +1325,53 @@ function fxSuperadmIsLoggedIn() { return !empty($_SESSION['usa_id']); } +/** + * Session superadm absente → login (pas « Accès refusé »). + * Rapports legacy : session compte public (com_info) suffit pour la vérif droits ensuite. + */ +function fxSuperadmRedirectToLoginIfNeeded($blnAllowCompteLegacy = false) { + if (fxSuperadmIsLoggedIn()) { + return; + } + if ($blnAllowCompteLegacy && !empty($_SESSION['com_info']['com_id'])) { + return; + } + + $_SESSION['superadm_redirect_after_login'] = $_SERVER['REQUEST_URI']; + + global $vDomaine; + $strLogin = 'login.php'; + if (!empty($vDomaine)) { + $strLogin = rtrim((string)$vDomaine, '/') . '/superadm/login.php'; + } + + header('Location: ' . $strLogin); + exit; +} + +/** URL cible après login superadm (évite redirection ouverte). */ +function fxSuperadmConsumeRedirectAfterLogin($strDefault = 'index.php') { + if (empty($_SESSION['superadm_redirect_after_login'])) { + return $strDefault; + } + + $strUrl = (string)$_SESSION['superadm_redirect_after_login']; + unset($_SESSION['superadm_redirect_after_login']); + + if (strpos($strUrl, '/superadm/') === false) { + return $strDefault; + } + + if (strpos($strUrl, '://') !== false) { + $strHost = parse_url($strUrl, PHP_URL_HOST); + if ($strHost !== ($_SERVER['HTTP_HOST'] ?? '')) { + return $strDefault; + } + } + + return $strUrl; +} + /** * Accès rapports superadm — super admin = tout ; sinon promoteur legacy (com_eve_promoteur / com_rapports). */ diff --git a/superadm/php/inc_start_time.php b/superadm/php/inc_start_time.php index e7e0c7c..67ec72a 100644 --- a/superadm/php/inc_start_time.php +++ b/superadm/php/inc_start_time.php @@ -18,3 +18,13 @@ if ($intUsaId > 0) { } $_SESSION['logged'] = time(); } + +// Session absente → login superadm (pas « Accès refusé »). Rapports legacy : com_info suffit. +$strScript = basename($_SERVER['SCRIPT_NAME'] ?? ''); +$tabPublicScripts = array('login.php', 'perdu.php', 'logout.php'); +$blnAllowCompteLegacy = ($strScript === 'rapport_new.php') + || ($strScript === 'index.php' && (($_GET['a'] ?? '') === 'report')); + +if (!in_array($strScript, $tabPublicScripts, true)) { + fxSuperadmRedirectToLoginIfNeeded($blnAllowCompteLegacy); +} diff --git a/superadm/rapport_new.php b/superadm/rapport_new.php index c3814d9..cbf3a3f 100644 --- a/superadm/rapport_new.php +++ b/superadm/rapport_new.php @@ -21,6 +21,8 @@ require_once('php/inc_fx_messages.php'); require_once('../php/inc_fx_memberships.php'); global $db, $objDatabasePreProd,$objDatabasecrm,$objDatabaseProd ; + +fxSuperadmRedirectToLoginIfNeeded(true); $blnLogged = fxSuperadmReportsAllowed(intval($intEvenement)); $strWhere = fxSetWhere($strReport, $_GET);