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