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]

Reply via email to