This is an automated email from the ASF dual-hosted git repository.
arm pushed a commit to branch arm
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git
The following commit(s) were added to refs/heads/arm by this push:
new 85f9e894 #698 - Hide JWT after 60s
85f9e894 is described below
commit 85f9e89477399aeeb99705a79015dc79f1da75db
Author: Alastair McFarlane <[email protected]>
AuthorDate: Tue Mar 10 10:47:42 2026 +0000
#698 - Hide JWT after 60s
---
atr/get/tokens.py | 5 ++++-
atr/static/js/ts/create-a-jwt.js | 20 ++++++++++++++++++--
atr/static/js/ts/create-a-jwt.js.map | 2 +-
atr/static/js/ts/finish-selected-move.js.map | 2 +-
atr/static/ts/create-a-jwt.ts | 20 ++++++++++++++++++--
5 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/atr/get/tokens.py b/atr/get/tokens.py
index 3947a270..be603aa4 100644
--- a/atr/get/tokens.py
+++ b/atr/get/tokens.py
@@ -72,7 +72,10 @@ async def tokens(_session: web.Committer, _tokens:
Literal["tokens"]) -> str:
form_classes="#issue-jwt-form",
submit_label="Generate JWT",
)
- jwt_section.pre(id="jwt-output", class_="d-none mt-2 p-3 atr-word-wrap
border rounded w-50")
+ jwt_section.div(id="jwt-container", class_="d-none")[
+ htm.p["Copy the below value. It will be cleared in ",
htm.span(id="time-remaining")],
+ htm.pre(id="jwt-output", class_="mt-2 p-3 atr-word-wrap border rounded
w-50"),
+ ]
if most_recent_pat and most_recent_pat.last_used:
jwt_section.p(".mt-3")[
"You most recently used a PAT to issue a JWT at ",
diff --git a/atr/static/js/ts/create-a-jwt.js b/atr/static/js/ts/create-a-jwt.js
index af435827..caf57e24 100644
--- a/atr/static/js/ts/create-a-jwt.js
+++ b/atr/static/js/ts/create-a-jwt.js
@@ -1,3 +1,4 @@
+"use strict";
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -18,8 +19,11 @@
*/
document.addEventListener("DOMContentLoaded", () => {
const form = document.getElementById("issue-jwt-form");
+ const outputContainer = document.getElementById("jwt-container");
const output = document.getElementById("jwt-output");
- if (!form || !output) {
+ const timeField = document.getElementById("time-remaining");
+ let timeoutObj, intervalObj;
+ if (!form || !output || !outputContainer || !timeField) {
return;
}
form.addEventListener("submit", async (e) => {
@@ -30,8 +34,20 @@ document.addEventListener("DOMContentLoaded", () => {
});
if (resp.ok) {
const token = await resp.text();
- output.classList.remove("d-none");
+ let time = 60;
+ clearTimeout(timeoutObj);
+ clearInterval(intervalObj);
+ timeField.textContent = time + "s";
+ outputContainer.classList.remove("d-none");
output.textContent = token;
+ timeoutObj = setTimeout(() => {
+ output.textContent = "";
+ outputContainer.classList.add("d-none");
+ }, 60000);
+ intervalObj = setInterval(() => {
+ time = time - 1;
+ timeField.textContent = time + "s";
+ }, 1000);
}
else {
alert("Failed to fetch JWT");
diff --git a/atr/static/js/ts/create-a-jwt.js.map
b/atr/static/js/ts/create-a-jwt.js.map
index 7f9d4ced..2ebe6f4b 100644
--- a/atr/static/js/ts/create-a-jwt.js.map
+++ b/atr/static/js/ts/create-a-jwt.js.map
@@ -1 +1 @@
-{"version":3,"file":"create-a-jwt.js","sourceRoot":"","sources":["../../ts/create-a-jwt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAS,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAA2B,CAAC;IACjF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAQ,EAAiB,EAAE,CAAC;QACjE,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,MAAM,IAA
[...]
\ No newline at end of file
+{"version":3,"file":"create-a-jwt.js","sourceRoot":"","sources":["../../ts/create-a-jwt.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAS,EAAE;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAA2B,CAAC;IACjF,MAAM,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,IAAI,UAAkB,EAAE,WAAmB,CAAC;IAE5C,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,I
[...]
\ No newline at end of file
diff --git a/atr/static/js/ts/finish-selected-move.js.map
b/atr/static/js/ts/finish-selected-move.js.map
index e34e32b9..efa6a0a6 100644
--- a/atr/static/js/ts/finish-selected-move.js.map
+++ b/atr/static/js/ts/finish-selected-move.js.map
@@ -1 +1 @@
-{"version":3,"file":"finish-selected-move.js","sourceRoot":"","sources":["../../ts/finish-selected-move.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,YAAY,CAAC;AAEb,IAAK,QAGJ;AAHD,WAAK,QAAQ;IACT,yBAAa,CAAA;IACb,uBAAW,CAAA;AAAC,CAChB,EAHK,QAAQ,KAAR,QAAQ,QAGZ;AAED,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IACrB,iBAAiB,EAAE,qBAAqB;IACxC,wBAAwB,EAAE,6BAA6B;IACvD,OAAO,EAAE,UAAU;IACnB,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,oBAAoB;IACrC,gBAAgB,EAAE,qBAAqB;IACvC,UAAU,EAAE,kBAAkB;IAC9B,QAAQ,EAAE
[...]
\ No newline at end of file
+{"version":3,"file":"finish-selected-move.js","sourceRoot":"","sources":["../../ts/finish-selected-move.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,YAAY,CAAC;AAEb,IAAK,QAGJ;AAHD,WAAK,QAAQ;IACT,yBAAa,CAAA;IACb,uBAAW,CAAA;AACf,CAAC,EAHI,QAAQ,KAAR,QAAQ,QAGZ;AAED,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IACrB,iBAAiB,EAAE,qBAAqB;IACxC,wBAAwB,EAAE,6BAA6B;IACvD,OAAO,EAAE,UAAU;IACnB,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,oBAAoB;IACrC,gBAAgB,EAAE,qBAAqB;IACvC,UAAU,EAAE,kBAAkB;IAC9B,QAAQ,EAAE,
[...]
\ No newline at end of file
diff --git a/atr/static/ts/create-a-jwt.ts b/atr/static/ts/create-a-jwt.ts
index c2111654..e6c5bddd 100644
--- a/atr/static/ts/create-a-jwt.ts
+++ b/atr/static/ts/create-a-jwt.ts
@@ -19,9 +19,12 @@
document.addEventListener("DOMContentLoaded", (): void => {
const form = document.getElementById("issue-jwt-form") as HTMLFormElement |
null;
+ const outputContainer = document.getElementById("jwt-container")
const output = document.getElementById("jwt-output");
+ const timeField = document.getElementById("time-remaining");
+ let timeoutObj: number, intervalObj: number;
- if (!form || !output) {
+ if (!form || !output || !outputContainer || !timeField) {
return;
}
@@ -35,8 +38,21 @@ document.addEventListener("DOMContentLoaded", (): void => {
if (resp.ok) {
const token = await resp.text();
- output.classList.remove("d-none");
+ let time = 60
+ clearTimeout(timeoutObj)
+ clearInterval(intervalObj)
+ timeField.textContent = time + "s"
+ outputContainer.classList.remove("d-none");
output.textContent = token;
+ timeoutObj = setTimeout(() => {
+ output.textContent = ""
+ outputContainer.classList.add("d-none");
+ clearInterval(intervalObj)
+ }, 60000)
+ intervalObj = setInterval(() => {
+ time = time - 1
+ timeField.textContent = time + "s"
+ }, 1000)
} else {
alert("Failed to fetch JWT");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]