From 067d4995fe92429dc2159192f5f5d807f162aea1 Mon Sep 17 00:00:00 2001 From: Federico Stagni Date: Wed, 28 Oct 2026 16:52:21 +0100 Subject: [PATCH] fix: remove TokenManager handler and web app --- .../WebApp/handler/TokenManagerHandler.py | 116 ------ .../TokenManager/classes/TokenManager.js | 345 ------------------ .../DIRAC/TokenManager/css/TokenManager.css | 0 3 files changed, 461 deletions(-) delete mode 100644 src/WebAppDIRAC/WebApp/handler/TokenManagerHandler.py delete mode 100644 src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/classes/TokenManager.js delete mode 100644 src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/css/TokenManager.css diff --git a/src/WebAppDIRAC/WebApp/handler/TokenManagerHandler.py b/src/WebAppDIRAC/WebApp/handler/TokenManagerHandler.py deleted file mode 100644 index d2a27be06..000000000 --- a/src/WebAppDIRAC/WebApp/handler/TokenManagerHandler.py +++ /dev/null @@ -1,116 +0,0 @@ -import json -import datetime -import jwt - -from DIRAC import gLogger -from DIRAC.ConfigurationSystem.Client.Helpers.Registry import getAllUsers -from DIRAC.FrameworkSystem.Client.TokenManagerClient import TokenManagerClient - -from WebAppDIRAC.Lib.WebHandler import WebHandler - - -class TokenManagerHandler(WebHandler): - DEFAULT_AUTHORIZATION = "authenticated" - - @classmethod - def initializeHandler(cls, serviceInfo): - """Init""" - cls.tm = TokenManagerClient() - - def web_getSelectionData(self, **kwargs): - user = self.getUserName() - if user.lower() == "anonymous": - return {"success": "false", "error": "You are not authorize to access these data"} - - users = getAllUsers() - users.sort() - return {"username": [[x] for x in users]} - - def web_getTokenManagerData(self, username="[]", **kwargs): - """Get tokens information - - :param str username: user name - - :return: dict - """ - user = self.getUserName() - if user.lower() == "anonymous": - return {"success": "false", "error": "You are not authorize to access these data"} - - result = self.tm.getUsersTokensInfo(list(json.loads(username))) - gLogger.info(f"*!*!*! RESULT: \n{result}") - if not result["OK"]: - return {"success": "false", "error": result["Message"]} - - tokens = [] - for record in result["Value"]: - tokens.append( - { - "TokenId": record["user_id"], - "UserName": record["username"], - "UserID": record["user_id"], - "Provider": record["provider"], - "ExpirationTime": str( - datetime.datetime.fromtimestamp(int(record["expires_at"])).strftime("%Y-%m-%d %H:%M:%S") - ), - "RefreshTokenExpirationTime": str( - datetime.datetime.fromtimestamp(int(record["rt_expires_at"])).strftime("%Y-%m-%d %H:%M:%S") - ), - } - ) - timestamp = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M [UTC]") - return {"success": "true", "result": tokens, "total": len(tokens), "date": timestamp} - - def web_deleteTokens(self, idList): - """Delete token - - :param str idList: IDs - - :return: dict - """ - err = [] - - try: - webIds = list(json.loads(idList)) - except Exception: - return {"success": "false", "error": "No valid id's specified"} - - tokens = [] - for uid in webIds: - retVal = self.tm.deleteToken(uid) - if retVal["OK"]: - tokens.append(uid) - else: - err.append(retVal["Message"]) - return {"success": "true", "result": tokens} if tokens else {"success": "false", "error": "; ".join(err)} - - def web_tokenData(self, userid: str, data_kind: str) -> dict: - """Retrieve access and refresh token, and scope to show in right click Menu - - :param str userid: user's token id - :param str data_kind: access/refresh token or scope - - :return: dict - """ - if (result := self.tm.getTokensByUserID(userid))["OK"]: - res = "" - if data_kind == "getAccessToken": - # Use get_unverified_claims to explicitly indicate we're reading - # the payload for display only, not verifying authenticity - res = ( - str(jwt.get_unverified_claims(result["Value"][0]["access_token"])) - .replace("{", "{\n") - .replace(", ", ",\n") - .replace("}", "\n}") - ) - elif data_kind == "getRefreshToken": - res = ( - str(jwt.get_unverified_claims(result["Value"][0]["refresh_token"])) - .replace("{", "{\n") - .replace(", ", ",\n") - .replace("}", "\n}") - ) - elif data_kind == "getScope": - res = result["Value"][0]["scope"] - return {"success": "true", "result": res} - return {"success": "false", "error": result["Message"]} diff --git a/src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/classes/TokenManager.js b/src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/classes/TokenManager.js deleted file mode 100644 index d4afeec91..000000000 --- a/src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/classes/TokenManager.js +++ /dev/null @@ -1,345 +0,0 @@ -/******************************************************************************* - * It is the transformation monitor class. - */ -Ext.define("DIRAC.TokenManager.classes.TokenManager", { - extend: "Ext.dirac.core.Module", - requires: [ - "Ext.panel.Panel", - "Ext.dirac.utils.DiracBoxSelect", - "Ext.form.field.TextArea", - "Ext.dirac.utils.DiracGridPanel", - "Ext.dirac.utils.DiracIdListButton", - "Ext.dirac.utils.DiracPageSizeCombo", - "Ext.dirac.utils.DiracPagingToolbar", - "Ext.dirac.utils.DiracJsonStore", - "Ext.dirac.utils.DiracAjaxProxy", - "Ext.dirac.utils.DiracApplicationContextMenu", - "Ext.dirac.utils.DiracBaseSelector", - ], - - loadState: function (data) { - var me = this; - - me.grid.loadState(data); - - me.leftPanel.loadState(data); - - if (data.leftPanelCollapsed) { - me.leftPanel.collapse(); - } - }, - - getStateData: function () { - var me = this; - var oStates = {}; - - oStates = { - grid: me.grid.getStateData(), - leftMenu: me.leftPanel.getStateData(), - }; - - oStates.leftPanelCollapsed = me.leftPanel.collapsed; - - return oStates; - }, - dataFields: [ - { - name: "tokenid", - }, - { - name: "UserName", - }, - { - name: "UserID", - }, - { - name: "Provider", - }, - { - name: "ExpirationTime", - type: "date", - dateFormat: "Y-m-d H:i:s", - }, - { - name: "RefreshTokenExpirationTime", - type: "date", - dateFormat: "Y-m-d H:i:s", - }, - ], - - initComponent: function () { - var me = this; - - GLOBAL.APP.CF.log("debug", "create the widget(initComponent)..."); - - me.launcher.title = "Token Manager"; - me.launcher.maximized = false; - - if (GLOBAL.VIEW_ID == "desktop") { - var oDimensions = GLOBAL.APP.MAIN_VIEW.getViewMainDimensions(); - - me.launcher.width = oDimensions[0]; - me.launcher.height = oDimensions[1]; - - me.launcher.x = 0; - me.launcher.y = 0; - } - - Ext.apply(me, { - layout: "border", - bodyBorder: false, - defaults: { - collapsible: true, - split: true, - }, - }); - - me.callParent(arguments); - }, - buildUI: function () { - var me = this; - - GLOBAL.APP.CF.log("debug", "create the widget...(buildUI)"); - - var selectors = { - username: "User", - }; - - var map = [["username", "username"]]; - - me.leftPanel = new Ext.create("Ext.dirac.utils.DiracBaseSelector", { - scope: me, - cmbSelectors: selectors, - datamap: map, - hasTimeSearchPanel: false, - url: "TokenManager/getSelectionData", - }); - - /* - * ----------------------------------------------------------------------------------------------------------- - * DEFINITION OF THE GRID - * ----------------------------------------------------------------------------------------------------------- - */ - var oProxy = Ext.create("Ext.dirac.utils.DiracAjaxProxy", { - url: GLOBAL.BASE_URL + me.applicationName + "/getTokenManagerData", - }); - - me.diffValues = {}; - me.dataStore = Ext.create("Ext.dirac.utils.DiracJsonStore", { - proxy: oProxy, - fields: me.dataFields, - groupField: "UserName", - scope: me, - remoteSort: false, - }); - - var pagingToolbar = null; - - var toolButtons = { - Visible: [ - { - text: "Delete", - handler: me.__deleteTokens, - properties: { - tooltip: "Click to delete the selected tokens!", - iconCls: "dirac-icon-delete", - }, - }, - ], - }; - - pagingToolbar = Ext.create("Ext.dirac.utils.DiracPagingToolbar", { - toolButtons: toolButtons, - store: me.dataStore, - scope: me, - }); - - var oColumns = { - checkBox: { - dataIndex: "TokenId", - }, - User: { - dataIndex: "UserName", - properties: { - width: 100, - sortable: true, - }, - }, - ID: { - dataIndex: "UserID", - properties: { - width: 650, - sortable: true, - }, - }, - Provider: { - dataIndex: "Provider", - properties: { - width: 100, - sortable: true, - }, - }, - "Access Token Expiration (UTC)": { - dataIndex: "ExpirationTime", - properties: { - width: 150, - sortable: true, - }, - renderer: function (value, metadata, record, rowIndex, colIndex, store) { - var expEpoch = record.data.ExpirationTime.getTime(); - /* eslint-disable */ - var nowEpoch = Ext.Date.now(); - /* eslint-enable */ - var secsLeft = expEpoch - nowEpoch; - - var msDay = 60 * 60 * 24 * 1000; - var secsLeft = Math.floor((expEpoch - nowEpoch) / msDay); - - var timeLimit = 30; // 30 days before expiration - - if (secsLeft < timeLimit) { - return '' + Ext.Date.format(record.data.ExpirationTime, "Y-m-d H:i:s") + " (" + secsLeft + ")" + ""; - } else { - return '' + Ext.Date.format(record.data.ExpirationTime, "Y-m-d H:i:s") + ""; - } - }, - }, - "Refresh Token Expiration (UTC)": { - dataIndex: "RefreshTokenExpirationTime", - properties: { - width: 150, - sortable: true, - }, - renderer: function (value, metadata, record, rowIndex, colIndex, store) { - var expEpoch = record.data.RefreshTokenExpirationTime.getTime(); - /* eslint-disable */ - var nowEpoch = Ext.Date.now(); - /* eslint-enable */ - var secsLeft = expEpoch - nowEpoch; - - var msDay = 60 * 60 * 24 * 1000; - var secsLeft = Math.floor((expEpoch - nowEpoch) / msDay); - - var timeLimit = 30; // 30 days before expiration - - if (secsLeft < timeLimit) { - return ( - '' + Ext.Date.format(record.data.RefreshTokenExpirationTime, "Y-m-d H:i:s") + " (" + secsLeft + ")" + "" - ); - } else { - return '' + Ext.Date.format(record.data.RefreshTokenExpirationTime, "Y-m-d H:i:s") + ""; - } - }, - }, - }; - - var menuitems = { - Visible: [ - { - text: "Access Token", - handler: me.__oprGetTokenData, - arguments: ["getAccessToken"], - properties: { - tooltip: "Click to show the decoded Access Token of the selected token.", - }, - }, - { - text: "Refresh Token", - handler: me.__oprGetTokenData, - arguments: ["getRefreshToken"], - properties: { - tooltip: "Click to show the decoded Refresh Token of the selected token.", - }, - }, - ], - }; - - me.contextGridMenu = new Ext.dirac.utils.DiracApplicationContextMenu({ - menu: menuitems, - scope: me, - }); - - me.grid = Ext.create("Ext.dirac.utils.DiracGridPanel", { - store: me.dataStore, - features: [ - { - ftype: "grouping", - }, - ], - oColumns: oColumns, - contextMenu: me.contextGridMenu, - pagingToolbar: pagingToolbar, - scope: me, - }); - - me.leftPanel.setGrid(me.grid); - - me.add([me.leftPanel, me.grid]); - }, - __oprGetTokenData: function (oDataKind) { - var me = this; - - var oId = GLOBAL.APP.CF.getFieldValueFromSelectedRow(me.grid, "UserID"); - - me.getContainer().body.mask("Wait ..."); - Ext.Ajax.request({ - url: GLOBAL.BASE_URL + me.applicationName + "/tokenData?userid=" + oId, - method: "POST", - params: { - data_kind: oDataKind, - id: oId, - }, - scope: me, - success: function (response) { - me.getContainer().body.unmask(); - var jsonData = Ext.JSON.decode(response.responseText); - - if (jsonData["success"] == "true") { - if (oDataKind == "getAccessToken") { - // text - me.getContainer().oprPrepareAndShowWindowText(jsonData["result"], "Access Token:" + oId); - } else if (oDataKind == "getRefreshToken") { - // text - me.getContainer().oprPrepareAndShowWindowText(jsonData["result"], "Refresh Token:" + oId); - } - } else { - GLOBAL.APP.CF.alert(jsonData["error"], "error"); - } - }, - }); - }, - __deleteTokens: function () { - var me = this; - var items = []; - var elememts = Ext.query("#" + me.id + " input.checkrow"); - - for (var i = 0; i < elememts.length; i++) if (elememts[i].checked) items.push(elememts[i].value); - - if (items && items.length > 0) { - msg = "tokens"; - - if (window.confirm("Are you sure you want to delete selected tokens?")) - Ext.Ajax.request({ - url: GLOBAL.BASE_URL + me.applicationName + "/deleteTokens", - params: { - idList: Ext.JSON.encode(items), - }, - success: function (oResponse) { - if (oResponse.status == 200) { - response = Ext.JSON.decode(oResponse.responseText); - if (response.success == "false") { - Ext.dirac.system_info.msg("Error", response.error); - } else { - Ext.dirac.system_info.msg("Notification", "Deleted " + response.result + " tokens"); - } - } else { - GLOBAL.APP.CF.showAjaxErrorMessage(response); - } - }, - failure: function (response) { - GLOBAL.APP.CF.showAjaxErrorMessage(response); - }, - }); - } - }, -}); diff --git a/src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/css/TokenManager.css b/src/WebAppDIRAC/WebApp/static/DIRAC/TokenManager/css/TokenManager.css deleted file mode 100644 index e69de29bb..000000000