diff --git a/assets/sai.css b/assets/sai.css
index 189afb3..ac6c188 100644
--- a/assets/sai.css
+++ b/assets/sai.css
@@ -1291,3 +1291,8 @@ canvas.power-graph {
.pcon-header-on {
background-color: #79da80;
}
+
+.plat-peer-ip {
+ font-size: 0.8em;
+ color: #555;
+}
diff --git a/assets/sai.js b/assets/sai.js
index 8a162ec..a7c9a8d 100644
--- a/assets/sai.js
+++ b/assets/sai.js
@@ -394,7 +394,7 @@ var lang_zhs = "{" +
"\"%{pf}前创建, 创作时间: %{ct}ms \"" +
"}}";
-var logs = "", redpend = 0, gitohashi_integ = 0, authd = 0, auth_is_admin = 0, exptimer, auth_user = "",
+var logs = "", redpend = 0, gitohashi_integ = 0, authd = 0, auth_is_admin = 0, auth_grant_level = -1, exptimer, auth_user = "",
logAnsiState = {}, logs_pending = "", lines_pending = "", times_pending = "",
ongoing_task_activities = {}, last_log_timestamp = 0, spreadsheet_data_cache = {}, loadreport_data_cache = {},
fadingTasks = new Map();
@@ -1019,10 +1019,10 @@ function sai_taskinfo_render(t, now_ut)
sai_event_render(t, now_ut, 0) + "</table></td><td class=\"ti\">" +
"<span class=\"ti1\">" + sai_plat_icon(t.t.platform, 2) +
san(t.t.platform) + "</span> ";
- if (authd && t.t.state != 0 && t.t.state != 3 && t.t.state != 4 && t.t.state != 5)
+ if (auth_is_admin && t.t.state != 0 && t.t.state != 3 && t.t.state != 4 && t.t.state != 5)
s += "<img class=\"rebuild\" alt=\"stop build\" src=\"stop.svg\" " +
"id=\"stop-" + san(t.t.uuid) + "\"> ";
- if (authd)
+ if (auth_is_admin)
s += "<img class=\"rebuild\" alt=\"rebuild\" src=\"rebuild.png\" " +
"id=\"rebuild-" + san(t.t.uuid) + "\"> " +
sai_stateful_taskname(t.t.state, t.t.taskname, 1);
@@ -1193,7 +1193,7 @@ function sai_event_summary_render(o, now_ut, reset_all_icon)
s += "<div class=\"" + cl + "\"><img src=\"/sai/failed.svg\"></div>";
s += "</a>";
- if (reset_all_icon && !gitohashi_integ && authd) {
+ if (reset_all_icon && !gitohashi_integ && auth_is_admin) {
s += "<br><img class=\"rebuild\" alt=\"rebuild all\" src=\"/sai/rebuild.png\" " +
"id=\"rebuild-ev-" + san(e.uuid) + "\"> ";
s += "<img class=\"rebuild\" alt=\"delete event\" src=\"/sai/delete.png\" " +
@@ -1473,7 +1473,7 @@ function createBuilderDiv(plat) {
`<div class="res-bar"><div class="res-bar-inner res-bar-disk w-0"></div></div>` +
`</div>`;
if (authd && auth_is_admin && plat.peer_ip)
- innerHTML += `<span class="plat-peer-ip" style="font-size: 0.8em; color: #555;">${hsanitize(plat.peer_ip)}</span>`;
+ innerHTML += `<span class="plat-peer-ip">${hsanitize(plat.peer_ip)}</span>`;
innerHTML += `</td></tr></tbody></table>`;
platDiv.innerHTML = innerHTML;
@@ -2836,25 +2836,30 @@ window.addEventListener("load", function() {
document.getElementById("noscript").display = "none";
/* LWS Login hook */
+ var loginPromise = Promise.resolve();
if (window.renderLwsLoginStatus)
- window.renderLwsLoginStatus('lws-login-status-container');
-
- fetch('.lws-login-status')
- .then(function(res) { return res.json(); })
- .then(function(data) {
- if (data.logged_in && data.has_grant) {
- authd = 1;
- if (data.is_admin)
- auth_is_admin = 1;
- }
- })
- .catch(function(err) {
- console.log('lws-login auth fetch failed: ', err);
- })
- .finally(function() {
- ws_open_sai();
- aging();
- });
+ loginPromise = window.renderLwsLoginStatus('lws-login-status-container');
+
+ loginPromise.then(function() {
+ return fetch('.lws-login-status');
+ })
+ .then(function(res) { return res.json(); })
+ .then(function(data) {
+ console.log("LOGIN STATUS DEBUG:", data);
+ if (data.logged_in && data.has_grant) {
+ authd = 1;
+ auth_grant_level = data.grant_level !== undefined ? data.grant_level : -1;
+ if (data.is_admin || auth_grant_level >= 2)
+ auth_is_admin = 1;
+ }
+ })
+ .catch(function(err) {
+ console.log('lws-login auth fetch failed: ', err);
+ })
+ .finally(function() {
+ ws_open_sai();
+ aging();
+ });
setInterval(function() {
update_task_activities();
@@ -2883,7 +2888,7 @@ window.addEventListener("load", function() {
target = target.parentElement;
}
- if (taskDiv && authd) {
+ if (taskDiv && auth_is_admin) {
event.preventDefault();
const taskUuid = taskDiv.id.substring(10);