86 lines
3.0 KiB
JavaScript
86 lines
3.0 KiB
JavaScript
/**
|
|
* Orchestrator login adapter for WESP login.html — persist JWT + enterprise after /api/auth/login.
|
|
*/
|
|
(function (global) {
|
|
const DEBUG_ENDPOINT = "http://127.0.0.1:7898/ingest/d209dffb-c63e-477b-8b08-a57520eaee9b";
|
|
const SESSION = "785e22";
|
|
|
|
function debugLog(hypothesisId, message, data) {
|
|
// #region agent log
|
|
fetch(DEBUG_ENDPOINT, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json", "X-Debug-Session-Id": SESSION },
|
|
body: JSON.stringify({
|
|
sessionId: SESSION,
|
|
runId: "login-fix",
|
|
hypothesisId,
|
|
location: "wesp-orchestrator-login.js",
|
|
message,
|
|
data,
|
|
timestamp: Date.now(),
|
|
}),
|
|
}).catch(function () {});
|
|
// #endregion
|
|
}
|
|
|
|
async function resolveEnterpriseId(accessToken) {
|
|
try {
|
|
const resp = await fetch("/api/v1/enterprise/enterprises", {
|
|
headers: { Authorization: "Bearer " + accessToken },
|
|
});
|
|
if (!resp.ok) return "";
|
|
const rows = await resp.json();
|
|
return Array.isArray(rows) && rows[0] && rows[0].id ? String(rows[0].id) : "";
|
|
} catch (_err) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
async function persistOrchestratorSession(payload) {
|
|
const token = payload && payload.access_token ? String(payload.access_token) : "";
|
|
const user = payload && payload.user ? payload.user : null;
|
|
if (!token || !user) {
|
|
debugLog("H2", "login missing token/user", { hasToken: Boolean(token), hasUser: Boolean(user) });
|
|
return false;
|
|
}
|
|
const enterpriseId = await resolveEnterpriseId(token);
|
|
if (global.ComptonWespAuth && typeof global.ComptonWespAuth.persistSession === "function") {
|
|
global.ComptonWespAuth.persistSession(token, user, enterpriseId);
|
|
}
|
|
global.__WESP_ORCH__ = Object.assign({}, global.__WESP_ORCH__ || {}, {
|
|
accessToken: token,
|
|
enterpriseId: enterpriseId,
|
|
userEmail: user.email || "",
|
|
});
|
|
debugLog("H1", "session persisted", { hasEnterprise: Boolean(enterpriseId), email: user.email || "" });
|
|
return Boolean(enterpriseId);
|
|
}
|
|
|
|
const nativeFetch = global.fetch.bind(global);
|
|
global.fetch = function orchestratorLoginFetch(input, init) {
|
|
const url = typeof input === "string" ? input : input && input.url ? input.url : "";
|
|
if (url.indexOf("/api/auth/login") === -1) {
|
|
return nativeFetch(input, init);
|
|
}
|
|
debugLog("H3", "wesp login request", { url: url.split("?")[0] });
|
|
return nativeFetch(input, init).then(async function (response) {
|
|
const cloned = response.clone();
|
|
let data = {};
|
|
try {
|
|
data = await cloned.json();
|
|
} catch (_err) {
|
|
debugLog("H3", "login response not json", { status: response.status });
|
|
return response;
|
|
}
|
|
if (response.ok && data.status === "success") {
|
|
await persistOrchestratorSession(data);
|
|
} else {
|
|
debugLog("H3", "login failed", { status: response.status, bodyStatus: data.status });
|
|
}
|
|
return response;
|
|
});
|
|
};
|
|
|
|
debugLog("H4", "orchestrator login adapter ready", { path: global.location.pathname });
|
|
})(window);
|