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