diff --git a/background.js b/background.js
index 41c7e13..14acfc9 100644
--- a/background.js
+++ b/background.js
@@ -85,7 +85,7 @@ async function fetchPlanningXml(origin, phpsessid, unixDate) {
`&day_start_hour=8` +
`&day_end_hour=19`;
console.log("[bg] fetchPlanningXml →", url.substring(0, 140));
- const r = await fetch(url, { credentials: "include" });
+ const r = await evFetch(url, origin);
console.log("[bg] status =", r.status);
if (!r.ok) {
// v4.2 : classifier l'erreur HTTP pour que le viewer affiche le bon
@@ -100,6 +100,32 @@ async function fetchPlanningXml(origin, phpsessid, unixDate) {
return xml;
}
+/**
+ * v5.0.9 : wrapper autour de fetch() qui ajoute systématiquement les
+ * headers de sécurité attendus par EasyVista (Referer, Sec-Fetch-Site,
+ * X-Requested-With). Sans ces headers, EV renvoie soit un
+ * (protection CSRF ou session expirée)
+ * 3. URL de logout : index.php?...&logout=1
+ * 4. Redirection vers le portail SSO : portail.etat-de-vaud.ch/sso/
+ * 5. Réponse JSON avec "isLogged": false
+ */
function looksLikeLoginPage(text) {
- // La page de login EasyVista contient cette chaîne
- return /customer_login|my\.policy/i.test((text || "").substring(0, 3000));
+ const t = (text || "").substring(0, 3000);
+ if (!t) return false;
+ // Pattern 1 : page de login EV classique
+ if (/customer_login|my\.policy/i.test(t)) return true;
+ // Pattern 2 : script de redirection (< 500 chars = probablement juste ça)
+ if (t.length < 500 && /