v5.0.11 — Détection contexte réseau (interne/externe via SSO)

This commit is contained in:
Quentin Rouiller
2026-04-21 15:44:14 +02:00
parent 7ba28d3bac
commit 6794360887
4 changed files with 294 additions and 20 deletions
+94 -5
View File
@@ -292,6 +292,80 @@ async function extendSessionKeepAlive(origin, phpsessid) {
return ms;
}
// ============================================================================
// v5.0.11 : détection automatique du contexte réseau (interne / externe)
// ============================================================================
/**
* 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.
*
* Le résultat est mis en cache dans chrome.storage.local pendant 1h pour
* éviter de refaire le test à chaque démarrage.
*
* @param {boolean} force - si true, ignore le cache et refait le test
* @returns {Promise<"internal"|"external">}
*/
async function detectNetworkContext(force = false) {
const CACHE_KEY = "network_context";
const CACHE_MAX_AGE_MS = 60 * 60 * 1000; // 1h
if (!force) {
try {
const data = await chrome.storage.local.get([CACHE_KEY]);
const cached = data[CACHE_KEY];
if (cached && cached.detectedAt && (Date.now() - cached.detectedAt) < CACHE_MAX_AGE_MS) {
console.log("[bg] detectNetworkContext : cache hit =", cached.networkContext);
return cached.networkContext;
}
} 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",
signal: controller.signal,
credentials: "omit" // pas besoin des cookies pour ce test
});
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 + ")");
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 + ")");
context = "external";
}
// Mettre en cache
try {
await chrome.storage.local.set({
[CACHE_KEY]: {
networkContext: context,
detectedAt: Date.now()
}
});
} catch (e) {}
return context;
}
/**
* Retourne l'origine EV à utiliser selon le contexte réseau détecté.
*/
function originForContext(context) {
return context === "internal"
? "https://itsma.etat-de-vaud.ch"
: "https://itsma.vd.ch";
}
// ============================================================================
// v4.2 : récupération de l'utilisateur connecté
// ============================================================================
@@ -1004,21 +1078,36 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.type === "openEasyVistaLogin") {
// v5.0.9 : ouvre EasyVista dans un nouvel onglet pour provoquer
// le SSO Windows automatique (reconnexion transparente).
// v5.0.10 : fallback sur itsma.vd.ch (externe, accessible de partout)
// au lieu de .etat-de-vaud.ch (inaccessible en télétravail).
const origin = msg.origin || "https://itsma.vd.ch";
// v5.0.11 : URL simplifiée (racine domaine au lieu de eventName=...),
// et utilise le contexte réseau détecté si l'origine n'est pas fournie.
let origin = msg.origin;
if (!origin) {
const context = await detectNetworkContext();
origin = originForContext(context);
}
try {
const tab = await chrome.tabs.create({
url: `${origin}/index.php?eventName=HelpDesk_PlanningItem`,
url: `${origin}/`, // racine → EV redirige vers SSO si besoin
active: true
});
sendResponse({ ok: true, tabId: tab.id });
sendResponse({ ok: true, tabId: tab.id, origin });
} catch (err) {
sendResponse({ ok: false, error: err.message || String(err) });
}
return;
}
if (msg.type === "detectNetwork") {
// v5.0.11 : détecte si on est en interne ou externe.
const context = await detectNetworkContext(!!msg.force);
sendResponse({
ok: true,
context, // "internal" | "external"
origin: originForContext(context) // URL correspondante
});
return;
}
if (msg.type === "cleanupOldCaches") {
const removed = await cleanupOldCaches(msg.daysToKeep || 7);
sendResponse({ ok: true, removed });