v5.0.11 — Détection contexte réseau (interne/externe via SSO)
This commit is contained in:
+94
-5
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user