From 0e276140f50160fad6c1bfc35191214f08055f4d Mon Sep 17 00:00:00 2001 From: Marius Vollmer Date: Fri, 2 Aug 2024 17:29:34 +0300 Subject: [PATCH] WIP - show warning if multihost is allowed --- pkg/static/login.html | 8 ++++++++ pkg/static/login.js | 41 ++++++++++++++++++++++++++++++++--------- pkg/static/login.scss | 4 ++-- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/pkg/static/login.html b/pkg/static/login.html index d91201916952..3740f0a7e490 100644 --- a/pkg/static/login.html +++ b/pkg/static/login.html @@ -21,6 +21,14 @@ + +
diff --git a/pkg/static/login.js b/pkg/static/login.js index e3956d0f9286..e3db47a7b963 100644 --- a/pkg/static/login.js +++ b/pkg/static/login.js @@ -338,21 +338,41 @@ import "./login.scss"; event.stopPropagation(); } - function boot() { - window.onload = null; + function deal_with_multihost() { + // If we are currently logged in to some machine, but still + // end up on the login page, we are about to load resources + // from two machines into the same browser origin. - if (!environment.page.allow_multi_host) { - // If we are currently logged in, we do not want to allow - // another login to a different machine. So we redirect to - // the current login. + const cur_machine = window.localStorage.getItem("current-machine"); - const cur_machine = window.localStorage.getItem("current-machine"); - if (cur_machine == "localhost" && window.location.pathname.startsWith("/=")) { + // Protect against outdated cur_machine values. + if (cur_machine == "localhost" && !window.location.pathname.startsWith("/=")) + return; + if (cur_machine && cur_machine != "localhost" && window.location.pathname.startsWith("/=" + cur_machine)) + return; + + function redirect_to_current_machine() { + if (cur_machine == "localhost") login_reload("/"); - } else if (cur_machine && !window.location.pathname.startsWith("/=" + cur_machine)) { + else login_reload("/=" + cur_machine); + } + + environment.page.allow_multi_host = true; // XXX + + if (cur_machine) { + if (!environment.page.allow_multi_host) + redirect_to_current_machine(); + else { + id("multihost-message").textContent = format(_("You are already connected to '$0' in this browser session. Connecting to other hosts will allow them to execute arbitrary code on each other. Please be careful."), cur_machine); + id("multihost-get-me-there").addEventListener("click", redirect_to_current_machine); + show('#multihost-warning'); } } + } + + function boot() { + window.onload = null; translate(); if (window.cockpit_po && window.cockpit_po[""]) { @@ -361,6 +381,8 @@ import "./login.scss"; document.documentElement.dir = window.cockpit_po[""]["language-direction"]; } + deal_with_multihost(); + setup_path_globals(window.location.pathname); /* Determine if we are nested or not, and switch styles */ @@ -420,6 +442,7 @@ import "./login.scss"; oauth_auto_login(); } } else if (logout_intent) { + window.localStorage.removeItem("current-machine"); show_login(logout_reason); } else if (need_host()) { show_login(); diff --git a/pkg/static/login.scss b/pkg/static/login.scss index 33e664562fa9..b1fddb29d11f 100644 --- a/pkg/static/login.scss +++ b/pkg/static/login.scss @@ -354,14 +354,14 @@ label.checkbox { display: none; } -.login-pf #banner { +.login-pf #banner, .login-pf #multihost-warning { margin-block: 1rem 0.5rem; margin-inline: 0; grid-area: banner; inline-size: 100%; } -#banner-message { +#banner-message, #multihost-message { white-space: pre-wrap; max-block-size: 12em; overflow: auto;