diff --git a/background.js b/background.js index 9861e07..141d970 100644 --- a/background.js +++ b/background.js @@ -298,8 +298,14 @@ async function extendSessionKeepAlive(origin, phpsessid) { /** * Détecte si on est sur le réseau interne (itsma.etat-de-vaud.ch accessible) - * ou externe (seul itsma.vd.ch accessible). Fait un HEAD test avec timeout - * court sur l'URL interne : si ça répond, on est interne ; sinon externe. + * ou externe (seul itsma.vd.ch accessible). Fait un fetch avec mode "no-cors" + * sur l'URL interne : si ça répond (même redirection SSO), on est interne. + * Si ça échoue (DNS unreachable, timeout), on est externe. + * + * v5.0.11 (fix) : mode "no-cors" pour éviter que l'erreur CORS de la + * redirection SSO (itsma.etat-de-vaud.ch → portail.etat-de-vaud.ch/sso/) + * soit interprétée comme un échec de connectivité. Au bureau, la redirection + * SSO passe → le fetch termine → on sait qu'on est interne. * * Le résultat est mis en cache dans chrome.storage.local pendant 1h pour * éviter de refaire le test à chaque démarrage. @@ -308,7 +314,7 @@ async function extendSessionKeepAlive(origin, phpsessid) { * @returns {Promise<"internal"|"external">} */ async function detectNetworkContext(force = false) { - const CACHE_KEY = "network_context"; + const CACHE_KEY = "network_context_v2"; // v5.0.12 : nouvelle clé pour invalider le cache fautif v5.0.11 const CACHE_MAX_AGE_MS = 60 * 60 * 1000; // 1h if (!force) { @@ -322,25 +328,28 @@ async function detectNetworkContext(force = false) { } catch (e) {} } - // Test HEAD sur l'URL interne avec timeout 2.5 sec const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), 2500); let context = "external"; try { - console.log("[bg] detectNetworkContext : test de itsma.etat-de-vaud.ch..."); - const r = await fetch("https://itsma.etat-de-vaud.ch/", { - method: "HEAD", + console.log("[bg] detectNetworkContext : test de itsma.etat-de-vaud.ch (mode no-cors)..."); + // v5.0.11 (fix) : no-cors évite l'erreur CORS de la redirection SSO. + // Si le fetch termine sans throw, le serveur est joignable = interne. + // Si timeout ou DNS fail, throw → externe. + await fetch("https://itsma.etat-de-vaud.ch/", { + method: "GET", + mode: "no-cors", signal: controller.signal, - credentials: "omit" // pas besoin des cookies pour ce test + credentials: "omit", + cache: "no-store" }); clearTimeout(timer); - // Tout statut HTTP (même 302, 404, 403) indique que le serveur est joignable - console.log("[bg] detectNetworkContext : interne accessible (status=" + r.status + ")"); + console.log("[bg] detectNetworkContext : interne accessible"); context = "internal"; } catch (err) { clearTimeout(timer); - // Timeout, DNS unreachable, erreur réseau = domaine interne inaccessible - console.log("[bg] detectNetworkContext : interne inaccessible, on est en externe (" + err.name + ")"); + // AbortError (timeout) ou TypeError (DNS unreachable / réseau coupé) + console.log("[bg] detectNetworkContext : interne inaccessible → externe (" + err.name + ": " + err.message + ")"); context = "external"; } diff --git a/manifest.json b/manifest.json index 7e886b3..6c5e9b0 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Planification", - "version": "5.0.11", + "version": "5.0.12", "description": "Vue claire et rapide du planning des techniciens EasyVista. Regroupe interventions et réservations par tech, affiche horaires, contact, lieu, catégorie et statut en un coup d'œil.", "permissions": ["activeTab", "scripting", "storage", "tabs", "alarms"], "host_permissions": [